Networkx:在可视化MultiGraph时重叠的边

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个回答

8

很遗憾,目前还没有这个功能。虽然从技术上讲是可能的,但是迄今为止还没有人编写过相关的代码。


相关内容,提示需要在NetworkX中添加的位置:https://groups.google.com/forum/#!msg/networkx-discuss/K6QYbpBDUfk/1GqbsiocpCAJ - 0 _

5

你可以直接使用已计算的节点位置,使用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


4
上面回答的一个改进是在nx.draw中添加connectionstyle参数:
import networkx as nx
G = nx.DiGraph()
G.add_nodes_from([0,1])
pos = nx.circular_layout(G)
nx.draw_networkx_nodes(G, pos, connectionstyle='arc3, rad = 0.1', node_color = 'r', node_size = 100, alpha = 1)
nx.draw_networkx_edges(G, pos,connectionstyle='arc3, rad = 0.1', edgelist = [(0,1)], width = 2, alpha = 0.5, edge_color='b')
nx.draw_networkx_edges(G, pos,connectionstyle='arc3, rad = 0.1', edgelist= [(1,0)], width = 1, alpha = 1)
plt.axis('off')
plt.show() 

See result here


1
有一个小错误,draw_networkx_nodes不再接受参数 connectionstyle。干杯 :-) - germannp

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() 

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接