当我将multigraph numpy邻接矩阵传递给networkx(使用from_numpy_matrix函数),然后尝试使用matplotlib绘制图形时,它会忽略多个边缘.
我怎么能让它画出多个边缘呢?
使用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
Run Code Online (Sandbox Code Playgroud)
但是,使用Networkx的绘图功能并不能解决问题
nx.draw_graphviz(Gm,prog='neato')
Run Code Online (Sandbox Code Playgroud)
是否可以使用Networkx的draw方法防止重叠边缘?
谢谢
我有这个功能,我想画一个自我循环。我怎样才能做到这一点?
边缘存在,但我认为在这个示例中只有一点(1,1),我无法添加节点的名称。我的目标是从邻接矩阵绘制图形。有没有更好的方法可以做到这一点?
import networkx as nx
import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrowPatch, Circle
import numpy as np
def draw_network(G,pos,ax,sg=None):
for n in G:
c=Circle(pos[n],radius=0.05,alpha=0.7)
ax.add_patch(c)
G.node[n]['patch']=c
x,y=pos[n]
seen={}
for (u,v,d) in G.edges(data=True):
n1=G.node[u]['patch']
n2=G.node[v]['patch']
rad=0.1
if (u,v) in seen:
rad=seen.get((u,v))
rad=(rad+np.sign(rad)*0.1)*-1
alpha=0.5
color='k'
e = FancyArrowPatch(n1.center,n2.center,patchA=n1,patchB=n2,
arrowstyle='-|>',
connectionstyle='arc3,rad=%s'%rad,
mutation_scale=10.0,
lw=2,
alpha=alpha,
color=color)
seen[(u,v)]=rad
ax.add_patch(e)
return e
G=nx.MultiDiGraph([(1,2),(1,1),(1,2),(2,3),(3,4),(2,4),
(1,2),(1,2),(1,2),(2,3),(3,4),(2,4)]
)
pos=nx.spring_layout(G)
ax=plt.gca()
draw_network(G,pos,ax)
ax.autoscale()
plt.axis('equal')
plt.axis('off')
plt.show()
Run Code Online (Sandbox Code Playgroud) 我有一个无向多重图,我想用标签绘制边缘,有什么建议吗?我遵循建议,但仍然没有边缘标签。 通过atomh33ls使用networkx在两个节点之间绘制多条边
G=nx.MultiGraph ()
G.add_edge(1,2,weight=7)
G.add_edge(1,2,weight=2)
G.add_edge(1,2,weight=3)
G.add_edge(3,1,weight=2)
G.add_edge(3,2,weight=3)
node_label = nx.get_node_attributes(G,'id')
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos, label=node_label)
nx.draw_networkx_labels(G, pos, label=node_label)
edge_labels=nx.get_edge_attributes(G,'weight')
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])
),
),
)
#nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
plt.axis('off')
plt.show()
Run Code Online (Sandbox Code Playgroud)