当我将多图 numpy 邻接矩阵传递给 networkx(使用 from_numpy_matrix 函数)然后尝试使用 matplotlib 绘制图形时,它会忽略多个边。
我怎样才能让它也绘制多个边缘?
当我将多图 numpy 邻接矩阵传递给 networkx(使用 from_numpy_matrix 函数)然后尝试使用 matplotlib 绘制图形时,它会忽略多个边。
我怎样才能让它也绘制多个边缘?
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
在 NetworkX 1.11 和更新版本上,nx.write_dot
不能按照networkx github 上的问题工作。解决方法是调用write_dot
using
from networkx.drawing.nx_pydot import write_dot
或者
from networkx.drawing.nx_agraph import write_dot
您可以使用您计算的节点位置直接使用 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()
您可以使用pyvis包。
我只是从 Jupyter 笔记本中的实际项目中复制粘贴这段代码。
from pyvis import network as pvnet
def plot_g_pyviz(G, name='out.html', height='300px', width='500px'):
g = G.copy() # some attributes added to nodes
net = pvnet.Network(notebook=True, directed=True, height=height, width=width)
opts = '''
var options = {
"physics": {
"forceAtlas2Based": {
"gravitationalConstant": -100,
"centralGravity": 0.11,
"springLength": 100,
"springConstant": 0.09,
"avoidOverlap": 1
},
"minVelocity": 0.75,
"solver": "forceAtlas2Based",
"timestep": 0.22
}
}
'''
net.set_options(opts)
# uncomment this to play with layout
# net.show_buttons(filter_=['physics'])
net.from_nx(g)
return net.show(name)
G = nx.MultiDiGraph()
[G.add_node(n) for n in range(5)]
G.add_edge(0, 1, label=1)
G.add_edge(0, 1, label=11)
G.add_edge(0, 2, label=2)
G.add_edge(0, 3, label=3)
G.add_edge(3, 4, label=34)
plot_g_pyviz(G)