networkx + Matplotlib로 곡선 그리기 (유향 그래프 표시)
직선으로 그린 경우의 예
다음과 같은 인접 행렬을 고려한다. 이것은 3×3의 완전 그래프가 된다.
\begin{pmatrix}
0 & 1 & 1 \\
1 & 0 & 1 \\
1 & 1 & 0 \\
\end{pmatrix}
networkx를 이용해 통상의 묘화를 실시한다.
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
W = np.array([[0, 1, 1], [1, 0, 1], [1, 1, 0]])
G = nx.from_numpy_array(W, create_using=nx.DiGraph) # 有向グラフにする際のオプション
nx.draw_networkx(G, arrows=True)
plt.show()
plt.close()
다음과 같은 출력이 얻어진다.
그럼에도 불구하고 디스플레이 자체는 가능하지만 디스플레이에 연결 강도와 같은 정보를 갖고 싶을 때 두 선이 겹치는 것을 볼 수 없게됩니다.
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
W = np.array([[0, 1, 1], [1, 0, 1], [1, 1, 0]])
G = nx.from_numpy_array(W, create_using=nx.DiGraph)
nx.set_edge_attributes(G, name='weight', values=1)
# 接続に重みの情報を乗せる、一方向だけ強くする
G.edges[1, 0]['weight'] = 3
G.edges[2, 1]['weight'] = 3
G.edges[0, 2]['weight'] = 3
nx.draw_networkx(G, arrows=True, width=[v['weight'] for v in G.edges.values()])
plt.show()
plt.close()
↑선의 한쪽만이 굵다=강하지만, 선의 구별이 붙지 않는다
해결
여기서 공식 문서 안에, draw_networkx()의 인수로서 설정하는 옵션의 키워드는 (networkx.draw_networkx_nodes(), networkx.draw_networkx_edges(), and networkx.draw_networkx_labels())의 항을 참조로 하기 때문에, 보면 connectionstyle
이라는 옵션이 있다.
이것을 사용해 본다.
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
W = np.array([[0, 1, 1], [1, 0, 1], [1, 1, 0]])
G = nx.from_numpy_array(W, create_using=nx.DiGraph)
nx.set_edge_attributes(G, name='weight', values=1)
G.edges[1, 0]['weight'] = 3
G.edges[2, 1]['weight'] = 3
G.edges[0, 2]['weight'] = 3
nx.draw_networkx(G, arrows=True, width=[v['weight'] for v in G.edges.values()], connectionstyle="arc3, rad=0.2")
plt.show()
plt.close()
여기서 connectionstyle
에 대한 자세한 내용은 draw_networkx_edges()을 참조하십시오.
다음과 같은 출력이 얻어진다.
matplotlib 문서
이것으로 선의 양쪽을 구별한 형태로 도시를 행할 수 있었다.
Reference
이 문제에 관하여(networkx + Matplotlib로 곡선 그리기 (유향 그래프 표시)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/NNNiNiNNN/items/23e41c0e6ec7d4aba96d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
\begin{pmatrix}
0 & 1 & 1 \\
1 & 0 & 1 \\
1 & 1 & 0 \\
\end{pmatrix}
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
W = np.array([[0, 1, 1], [1, 0, 1], [1, 1, 0]])
G = nx.from_numpy_array(W, create_using=nx.DiGraph) # 有向グラフにする際のオプション
nx.draw_networkx(G, arrows=True)
plt.show()
plt.close()
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
W = np.array([[0, 1, 1], [1, 0, 1], [1, 1, 0]])
G = nx.from_numpy_array(W, create_using=nx.DiGraph)
nx.set_edge_attributes(G, name='weight', values=1)
# 接続に重みの情報を乗せる、一方向だけ強くする
G.edges[1, 0]['weight'] = 3
G.edges[2, 1]['weight'] = 3
G.edges[0, 2]['weight'] = 3
nx.draw_networkx(G, arrows=True, width=[v['weight'] for v in G.edges.values()])
plt.show()
plt.close()
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
W = np.array([[0, 1, 1], [1, 0, 1], [1, 1, 0]])
G = nx.from_numpy_array(W, create_using=nx.DiGraph)
nx.set_edge_attributes(G, name='weight', values=1)
G.edges[1, 0]['weight'] = 3
G.edges[2, 1]['weight'] = 3
G.edges[0, 2]['weight'] = 3
nx.draw_networkx(G, arrows=True, width=[v['weight'] for v in G.edges.values()], connectionstyle="arc3, rad=0.2")
plt.show()
plt.close()
Reference
이 문제에 관하여(networkx + Matplotlib로 곡선 그리기 (유향 그래프 표시)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/NNNiNiNNN/items/23e41c0e6ec7d4aba96d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)