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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:06:01