如何使用matplotlib或graphviz在networkx中绘制多图

G B*_*G B 17 networkx python-2.7

当我将multigraph numpy邻接矩阵传递给networkx(使用from_numpy_matrix函数),然后尝试使用matplotlib绘制图形时,它会忽略多个边缘.

我怎么能让它画出多个边缘呢?

Ari*_*ric 19

Graphviz在绘制平行边缘方面做得很好.您可以通过编写点文件然后使用Graphviz处理(例如下面的neato布局)来使用NetworkX.除了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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在NetworkX 1.11和更新版本上,在networkx github上nx.write_dot不能按照问题运行.解决方法是write_dot使用调用

from networkx.drawing.nx_pydot import write_dot

要么

from networkx.drawing.nx_agraph import write_dot

  • 截至2018年,这仍然是最佳方法吗?(我只对最多包含数十个节点的小型图感兴趣。) (2认同)

ato*_*3ls 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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明