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

如何用NetworkX在两个节点间添加两条不同权重的有向边

MultiDiGraph双向边及权重显示问题解决方法

问题说明

使用NetworkX的MultiDiGraph构建图时,节点x与w之间的两条双向有向边(x→w权重2、w→x权重4)在默认绘图中重叠,无法区分,也无法正确显示两条边的权重。

修复代码

import networkx as nx
import matplotlib.pyplot as plt

graph2 = nx.MultiDiGraph()
graph2.add_nodes_from(["w", "x", "y", "z"])
graph2.add_weighted_edges_from(
    [("x", "w", 2), ("z", "x", 2), ("x", "y", 3), ("y", "y", 2), 
     ("w", "y", 1), ("w", "w", 1), ("w", "z", 5), ("w", "x", 4)]
)

node_positions = {"x": (0, 0), "w": (2, 0), "y": (2, -2), "z": (0, 2)}

# 单独绘制节点,不绘制默认边
nx.draw(graph2, pos=node_positions, with_labels=True, 
        node_color="pink", node_size=2000, edgelist=[])

# 绘制弧形边,让双向边分离
nx.draw_networkx_edges(graph2, pos=node_positions, 
                       connectionstyle='arc3,rad=0.2', arrowsize=20)

# 构造包含边唯一标识的权重字典,适配MultiDiGraph
edge_labels = {(u, v, k): w for u, v, k, w in graph2.edges(data='weight', keys=True)}
# 绘制边权重标签,调整位置避免重叠
nx.draw_networkx_edge_labels(graph2, pos=node_positions, 
                             edge_labels=edge_labels, label_pos=0.3)

plt.show()

核心修改点

  • 拆分节点与边的绘制流程:绘制节点时通过edgelist=[]跳过默认边绘制,改用nx.draw_networkx_edges手动绘制,并通过connectionstyle='arc3,rad=0.2'设置弧形边,让双向边分离显示(rad值可按需调整弧度)。
  • 适配MultiDiGraph的边标签格式:用(u, v, k)作为标签字典的键(k是每条边的唯一标识),确保两条边的权重都能正确匹配并显示。
  • 调整标签位置:通过label_pos=0.3让权重标签显示在边的中间偏起点处,避免标签重叠。

内容的提问来源于stack exchange,提问作者Ilse H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:26:25