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

手动修改networkx绘图节点位置坐标不生效问题

核心原因

修改节点坐标后输出图像无差异,本质是matplotlib默认开启的自动轴适配机制导致的。
调用nx.draw绘图时,matplotlib会自动计算当前所有绘制元素(节点、边、标签)的坐标边界,自动调整XY轴的显示范围,让所有元素刚好撑满绘图区域。你将所有节点的X坐标统一放大10^5倍的操作,只是把所有元素在水平方向做了同比例的整体拉伸,元素之间的相对位置、元素和整体坐标边界的比例完全没有变化,matplotlib自动适配轴范围之后,视觉上不会产生任何差异,自然两张图的节点间距、标签相对尺寸都完全一致。
举个直白的类比:你把一张画在弹性橡皮膜上的图整体横向拉长100倍,看的时候也把视线拉远100倍,看到的内容和原来没有任何区别。

修复方案

要实现你预期的水平方向拉宽、节点水平间距变大的效果,只需要在第二次绘图时禁用自动轴缩放,或者手动指定和第一次绘图一致的轴范围即可,参考修改代码:

import matplotlib.pyplot as plt
import networkx as nx
from networkx.drawing.nx_pydot import graphviz_layout

T = nx.balanced_tree(2, 5)
T = nx.relabel_nodes(T, lambda x: str(x))
pos = graphviz_layout(T, prog="dot")

plt.figure()
nx.draw(T, pos, with_labels=True)
# 可先打印第一次绘图的原始轴范围备用
# print(plt.xlim(), plt.ylim())
plt.savefig("1.png")

pos = {key: (val[0] * pow(10, 5), val[1]) for key, val in pos.items()}
plt.figure(figsize=(20, 4)) # 可配合调宽画布尺寸,拉伸效果更明显
nx.draw(T, pos, with_labels=True)
# 手动指定和第一次绘图一致的x轴范围,禁用自动适配
plt.xlim(-10, 120) # 数值替换成你第一次打印得到的原始xlim范围即可
plt.savefig("2.png")

如果需要更灵活的布局调整,也可以直接在调用graphviz_layout时通过graphviz的参数指定节点间距,不需要后续手动修改坐标:

# 直接在生成布局时指定dot引擎的层级间距参数,省掉后续改坐标的步骤
pos = graphviz_layout(T, prog="dot", args="-Granksep=5")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:39:19