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

如何使用NetworkX绘制MultiDiGraph并解决绘图报错问题

NetworkX MultiDiGraph有向多重图绘制报错修复方案

报错核心原因

  • 变量命名冲突:代码中直接将permutations赋值为排列结果列表,覆盖了从itertools导入的permutations方法,属于代码隐患。
  • 多重图边属性格式不匹配:MultiDiGraph的每条边带有唯一key标识,nx.get_edge_attributes返回的边标签字典键为(起点, 终点, 边序号)三元组,旧版本nx.draw_networkx_edge_labels默认仅识别(起点, 终点)二元组键,直接传入会触发类型报错。
  • 变量未定义隐患:当传入weight=False时,edge_labels不会被定义,后续调用绘制方法会触发变量未定义报错。
  • 双向边重叠问题:默认绘制模式下双向边会完全重叠,无法区分方向和对应权重。

修改后完整可运行代码

import pandas as pd
import numpy as np
import networkx as nx
from itertools import combinations, permutations

# 修改变量名,避免覆盖导入的permutations方法
names = ['Mike','Bob','Phil']
perm_list = list(permutations(names, 2))

col1 = [val[0] for val in perm_list]
col2 = [val[1] for val in perm_list]
transactions = [1,3,5,3,9,2]

df = pd.DataFrame({'Sender':col1,'Recipient':col2,'Num_Transactions':transactions})

G = nx.MultiDiGraph()
G.add_nodes_from(names)

E = list(zip(df['Sender'].tolist(),df['Recipient'].tolist(),df['Num_Transactions'].tolist()))
G.add_weighted_edges_from(E)

def draw_graph(G, nodes_position, weight):
    # 添加connectionstyle参数让双向边呈弧形分开,避免重叠
    nx.draw(G, nodes_position, with_labels=True, font_size=15, node_size=400,
            edge_color='gray', arrowsize=10, connectionstyle='arc3, rad=0.1')
    edge_labels = {}
    if weight==True:
        # 处理多重图边标签,将三元组键转换为二元组
        for (u, v, key), w in nx.get_edge_attributes(G,'weight').items():
            # 若存在同起点同终点的多条平行边,可替换为下方注释代码拼接权重
            # edge_labels[(u, v)] = edge_labels.get((u, v), '') + f'/{w}'
            edge_labels[(u, v)] = w
    # 增加label_pos参数,让边标签显示在弧形边中间位置
    nx.draw_networkx_edge_labels(G, nodes_position, edge_labels=edge_labels, label_pos=0.3)

draw_graph(G, nx.circular_layout(G), True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:36:03