手动修改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
相关产品推荐
相关产品推荐

