web-dev-qa-db-ja.com

matplotlibまたはgraphvizを使用してnetworkxでマルチグラフを描画する方法

マルチグラフのnumpy隣接行列をnetworkxに渡して(from_numpy_matrix関数を使用)、matplotlibを使用してグラフを描画しようとすると、複数のエッジが無視されます。

どうすれば複数のエッジも描画させることができますか?

19
G B

Graphvizは、平行なエッジをうまく描画します。ドットファイルを書き込んでからGraphvizで処理することでNetworkXでそれを使用できます(例:以下のneatoレイアウト)。 NetworkXに加えてpydotまたはpygraphvizが必要になります

In [1]: import networkx as nx

In [2]: G=nx.MultiGraph()

In [3]: G.add_Edge(1,2)

In [4]: G.add_Edge(1,2)

In [5]: nx.write_dot(G,'multi.dot')

In [6]: !neato -T png multi.dot > multi.png

enter image description here

NetworkX 1.11以降では、nx.write_dotnetworkx githubの問題 のように機能しません。回避策は、を使用してwrite_dotを呼び出すことです。

from networkx.drawing.nx_pydot import write_dot

または

from networkx.drawing.nx_agraph import write_dot

18
Aric

計算したノード位置を使用して、matplotlibを直接使用できます。

G=nx.MultiGraph ([(1,2),(1,2),(1,2),(3,1),(3,2)])
pos = nx.random_layout(G)
nx.draw_networkx_nodes(G, pos, node_color = 'r', node_size = 100, alpha = 1)
ax = plt.gca()
for e in G.edges:
    ax.annotate("",
                xy=pos[e[0]], xycoords='data',
                xytext=pos[e[1]], textcoords='data',
                arrowprops=dict(arrowstyle="->", color="0.5",
                                shrinkA=5, shrinkB=5,
                                patchA=None, patchB=None,
                                connectionstyle="arc3,rad=rrr".replace('rrr',str(0.3*e[2])
                                ),
                                ),
                )
plt.axis('off')
plt.show()

enter image description here

0
atomh33ls