networkx + Matplotlib로 곡선 그리기 (유향 그래프 표시)

networkx에서 유향 그래프를 도시할 때에 곡선을 그리고 싶은 경우가 있지만, 그를 위한 옵션이 지극히 찾기 어려웠기 때문에 메모.

직선으로 그린 ​​경우의 예



다음과 같은 인접 행렬을 고려한다. 이것은 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 문서

이것으로 선의 양쪽을 구별한 형태로 도시를 행할 수 있었다.

좋은 웹페이지 즐겨찾기