You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:30:27