如何用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
相关产品推荐
相关产品推荐

