如何在NetworkX中根据边宽比例动态调整箭头尺寸
问题根因
- 报错的核心原因是:低版本NetworkX的
nx.draw_networkx_edges()接口的arrowsize参数仅支持传入单个固定数值,不支持传入与边数匹配的序列/列表,因此你传入边属性列表后会触发类型错误。 - 你原有代码还存在一处笔误:
arrow = nx.get_edge_attributes(G,'width')错误读取了width属性,应该改为读取你预存的arrow属性,但即使修正该笔误,低版本下仍然会报错。
解决方案
方案1:遍历单条边独立绘制(全版本兼容)
该方案兼容性最好,不需要升级依赖,直接对每条边单独调用绘制接口,传入对应宽度和箭头尺寸即可,示例代码如下:
import networkx as nx import pandas as pd # 你的前置数据处理代码保持不变 spec_year_sum['width'] = spec_year_sum['value_diff'].abs()*25 +0.05 # 可以给arrowsize单独设置缩放系数,适配视觉效果 spec_year_sum['arrow_size'] = spec_year_sum['value_diff'].abs()*15 + 2 # 系数可自行调整 G = nx.from_pandas_edgelist(spec_year_sum, 'reporteriso3', 'partneriso3', ['width','color','arrow_size'], create_using= nx.DiGraph()) # 获取所有边的属性 edge_attrs = nx.get_edge_attributes(G, ['width', 'color', 'arrow_size']) # 遍历每条边单独绘制 for (u, v), attrs in edge_attrs.items(): nx.draw_networkx_edges( G, pos, edgelist=[(u, v)], # 每次仅绘制当前单条边 width=attrs['width'], arrowsize=attrs['arrow_size'], edge_color=attrs['color'] )
你可以根据实际显示效果调整arrow_size的计算系数,保证箭头和边宽的比例协调即可。
方案2:升级NetworkX到3.3及以上版本
NetworkX从3.3版本开始支持arrowsize参数传入与边数等长的序列,升级后你原来的写法(修正笔误后)可以直接运行:
# 修正笔误,读取arrow属性 arrow_sizes = nx.get_edge_attributes(G,'arrow').values() nx.draw_networkx_edges(G,pos,arrowsize=list(arrow_sizes), width=list(widths.values()))
内容的提问来源于stack exchange,提问作者Jeong In Kim
相关产品推荐
相关产品推荐

