15

以下多重图正确绘制(即平行边不重叠)使用graphvizneato生成png(如this answer所示)

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

好吧,我知道它可能不是您要找的东西,但是我遇到了类似的问题,我想要一个有向图,其中两个节点之间的边根据方向具有不同的权重(无论是进入还是退出节点),我所做的工作是我为每个边缘使用了不同的颜色,并降低了其中一个边缘的不透明度,因此即使它们重叠也会显示出来。我只需要两个节点之间的两条边,所以它对我有用。

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

对上述答案的改进是将connectionstyle参数添加到 nx.draw:

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

在这里查看结果

于 2020-01-26T10:18:49.280 回答