Networkx:可视化MultiGraph时重叠边缘

16 投票
4 回答
15182 浏览
提问于 2025-04-17 16:56

下面这个多重图的绘制效果是正确的(也就是说,平行的边不会重叠),是通过使用 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

对上面答案的一个改进是给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() 

查看结果

8

很遗憾,目前还不行。虽然从技术上讲是有可能做到的,但到现在为止还没有人写出相关的代码。

6

你可以直接使用你计算出来的节点位置来使用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()

在这里输入图片描述

撰写回答