NetworkX多边图中如何绘制边权重标签?
解决MultiGraph绘图的两个问题:NetworkX边标签报错与Pyvis渲染错误
一、NetworkX中显示MultiGraph的边权重
nx.draw_networkx_edge_labels不支持MultiGraph,需手动绘制边和权重标签,结合你已有的弧线绘制逻辑,补充标签添加代码即可解决:
完整代码:
import matplotlib.pyplot as plt import networkx as nx G = nx.MultiGraph() edge_list = [("1", "2", 1), ("3", "1", 2)] G.add_weighted_edges_from(edge_list) pos = nx.spring_layout(G, seed=5) # 绘制节点与节点标签 nx.draw_networkx_nodes(G, pos, node_color='b', node_size=500, alpha=1) nx.draw_networkx_labels(G, pos, font_color='w') ax = plt.gca() # 遍历所有边,获取起点、终点、唯一标识key和权重 for u, v, key, weight in G.edges(data='weight', keys=True): # 绘制弧形边 ax.annotate("", xy=pos[u], xycoords='data', xytext=pos[v], textcoords='data', arrowprops=dict(arrowstyle="-", color="black", shrinkA=12, shrinkB=12, connectionstyle=f"arc3,rad={0.3*key}" # 用key区分弧度,避免边重叠 ), ) # 计算标签位置:边中点偏移,避免标签重叠 mid_x = (pos[u][0] + pos[v][0]) / 2 + 0.05 * key mid_y = (pos[u][1] + pos[v][1]) / 2 + 0.05 * key # 添加权重标签 ax.text(mid_x, mid_y, str(weight), fontsize=12, ha='center', va='center') plt.axis('off') plt.show()
核心要点:
- 用
G.edges(data='weight', keys=True)遍历边,获取每条边的完整属性 - 借助边的唯一
key值控制弧形弧度和标签偏移,避免两条边的线、标签重叠 - 手动计算标签中点位置,确保权重与对应边匹配
二、Pyvis处理MultiGraph的AttributeError报错
nt.from_nx(G)对MultiGraph的支持存在缺陷,导致返回NoneType对象。改为手动添加节点和边即可修复:
完整代码:
from pyvis.network import Network import networkx as nx G = nx.MultiGraph() edge_list = [("1", "2", 1), ("3", "1", 2)] G.add_weighted_edges_from(edge_list) nt = Network(directed=False, height="500px", width="800px") # 手动添加所有节点 for node in G.nodes(): nt.add_node(node, label=node) # 手动添加每条边并指定权重 for u, v, key, weight in G.edges(data='weight', keys=True): nt.add_edge(u, v, value=weight, title=f"Weight: {weight}") nt.set_edge_smooth('dynamic') nt.write_html('foo.html') # 用write_html替代show,避免环境依赖问题 # 如需直接打开页面,可添加: # import webbrowser # webbrowser.open('foo.html')
核心要点:
- 放弃
from_nx方法,手动添加节点和边,确保Pyvis正确解析MultiGraph的每条边 - 用
write_html替代show,减少不同环境下的渲染异常 - 为边添加
title属性,鼠标悬停时可查看权重详情
内容的提问来源于stack exchange,提问作者Curious
相关产品推荐
相关产品推荐

