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

