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

使用箭头时NetworkX弯曲边未完全连接节点的问题排查

问题原因及解决办法

核心问题

你遇到的边无法连接节点的情况,是因为设置arrows=True后,NetworkX会使用FancyArrowPatch绘制边,这类箭头对象默认会在边的两端预留收缩空间(shrinkA、shrinkB参数默认值不为0),再加上默认箭头样式的头部占用,导致边和节点之间出现间隙。

具体解决方式

分两种场景处理:

场景1:不需要箭头,只想画弯曲边

既然需求是弯曲边而非箭头,完全可以去掉arrows=True,改用arrowstyle='-'禁用箭头,同时保留弯曲效果,还能避免警告:

import networkx as nx
import matplotlib.pyplot as plt

G = nx.gnm_random_graph(n=1000, m=100)
pos = nx.spring_layout(G)  # 补充节点位置生成代码
fig, ax = plt.subplots(dpi=300)
nx.draw_networkx_nodes(G, pos, edgecolors='black', node_size=20, linewidths=0.25, ax=ax)
nx.draw_networkx_edges(
    G, pos, 
    width=0.5, 
    connectionstyle="arc3, rad=0.3", 
    edge_color='gray',
    arrowstyle='-',  # 禁用箭头,直接绘制线段
    min_source_margin=0, 
    min_target_margin=0, 
    ax=ax
)
plt.show()

场景2:确实需要箭头+弯曲边

如果必须保留箭头,需要手动设置shrinkA=0和shrinkB=0消除默认收缩空间,同时调整箭头样式适配节点大小:

import networkx as nx
import matplotlib.pyplot as plt

G = nx.gnm_random_graph(n=1000, m=100)
pos = nx.spring_layout(G)
fig, ax = plt.subplots(dpi=300)
nx.draw_networkx_nodes(G, pos, edgecolors='black', node_size=20, linewidths=0.25, ax=ax)
nx.draw_networkx_edges(
    G, pos, 
    width=0.5, 
    connectionstyle="arc3, rad=0.3", 
    edge_color='gray',
    arrows=True,
    shrinkA=0,  # 取消源节点端的收缩
    shrinkB=0,  # 取消目标节点端的收缩
    arrowstyle='->,head_width=0.2,head_length=0.3',  # 调整箭头大小适配节点
    min_source_margin=0, 
    min_target_margin=0, 
    ax=ax
)
plt.show()

补充说明

你代码里遗漏了节点位置变量pos的生成,必须先通过布局算法(比如spring_layout、circular_layout)生成节点坐标,否则无法正常绘图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:51:06