15

次のマルチグラフは、graphviz neato を使用して png を生成する (この回答に示されているように) を使用して正しくプロットされます (つまり、平行なエッジが重なりません) 。

import networkx as nx
nx.MultiGraph ([(1,2),(1,2),(1,2),(3,1),(3,2)])
nx.write_dot(Gm,'multi.dot')
!neato -T png multi.dot > multi.png

ただし、Networkx の描画機能を使用してもうまくいきません

nx.draw_graphviz(Gm,prog='neato')

Networkx の描画方法を使用してエッジの重なりを防ぐことは可能ですか?

ありがとう

4

4 に答える 4

8

残念ながら違います。技術的には可能ですが、今のところ誰もコードを書いていません。

于 2013-02-25T14:21:51.507 に答える
3

計算したノード位置を使用して、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()

ここに画像の説明を入力

于 2020-03-10T09:59:48.707 に答える
2

おそらくあなたが探しているものではないことはわかっていますが、2つのノード間のエッジが方向に応じて異なる重みを持つ有向グラフが必要な同様の問題に直面していました(出入りするかどうか)ノードの)そして私がした回避策は、エッジごとに異なる色を使用し、そのうちの1つの不透明度を下げて、それらが重なっても表示されるようにすることでした。2 つのノード間に必要なエッジは 2 つだけだったので、うまくいきました。

G = nx.DiGraph()
G.add_nodes_from([0,1])
pos = nx.circular_layout(G)
nx.draw_networkx_nodes(G, pos, node_color = 'r', node_size = 100, alpha = 1)
nx.draw_networkx_edges(G, pos, edgelist = [(0,1)], width = 2, alpha = 0.5, edge_color='b')
nx.draw_networkx_edges(G, pos, edgelist= [(1,0)], width = 1, alpha = 1)
plt.axis('off')
plt.show() 

ここに画像の説明を入力

于 2016-05-07T03:25:45.893 に答える