[英]How to label edges of a Multigraph in Networkx and matplotlib?
I have a Undirected Multigraph and I wanna draw the edges with labels, any suggestion?我有一个无向多图,我想用标签绘制边缘,有什么建议吗? I the follow suggestion, but still no edges labels.
我遵循建议,但仍然没有边缘标签。 Drawing multiple edges between two nodes with networkx by atomh33ls
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()
The dictionary returned by nx.get_edge_attributes
has the structure (source, dest, enum):attr
, where the third field just enumerates the occurrences of each edge. nx.get_edge_attributes
返回的字典具有结构(source, dest, enum):attr
,其中第三个字段仅枚举每条边的出现。 This third field is necessary because keys have to be unique in the dictionary.这第三个字段是必需的,因为键在字典中必须是唯一的。 However this will imply that it cannot be used in
nx.draw_networkx_edge_labels
, because it expects a (source, dest):attr
structured dict.但是,这意味着它不能在
nx.draw_networkx_edge_labels
中使用,因为它需要一个(source, dest):attr
结构化字典。
nx.get_edge_attributes(G,'weight')
# {(1, 2, 0): 7, (1, 2, 1): 2, (1, 2, 2): 3, (1, 3, 0): 2, (2, 3, 0): 3}
So really this won't work on MultiGraphs.所以这真的不适用于MultiGraphs。 Something you can do, following the same idea as here , is to
label
the edges with the weight values, and export the graph to dot
with nx.write_dot
, which will use those labels
on the visualization.遵循与此处相同的想法,您可以做的事情是
label
带有权重值的边,并使用dot
将图形导出nx.write_dot
,这将在可视化上使用这些labels
。
Thanks to @yatu.感谢@yatu。 This is the elegant solution so far for Undirected Multigraph labeled.
这是迄今为止标记的无向多图的优雅解决方案。 Please send me more tips to improve the style!
请给我更多改进风格的提示!
import networkx as nx
import matplotlib.pyplot as plt
from IPython.display import Image
G=nx.MultiGraph ()
G.add_edge(1,2,weight=1)
G.add_edge(1,2,weight=2)
G.add_edge(1,2,weight=3)
G.add_edge(3,1,weight=4)
G.add_edge(3,2,weight=5)
for edge in G.edges(data=True): edge[2]['label'] = edge[2]['weight']
node_label = nx.get_node_attributes(G,'id')
pos = nx.spring_layout(G)
node_label = nx.get_node_attributes(G,'id')
pos = nx.spring_layout(G)
p=nx.drawing.nx_pydot.to_pydot(G)
p.write_png('multi.png')
Image(filename='multi.png')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.