Matplotlib imshow坐标同步问题:NetworkX图叠加错位
问题分析与解决
问题和图像保存方式无关,核心是plt.imshow的默认设置和matplotlib绘图的坐标系统不匹配,加上自动缩放导致错位:
- NetworkX绘制节点、边时,matplotlib默认以左下角为坐标原点
plt.imshow默认以左上角为坐标原点,还会自动调整图像宽高比适配坐标轴,导致图像被拉伸或压缩
修正方案
调整imshow的参数,让图像坐标和绘图坐标对齐,同时避免自动缩放:
修正后的加载叠加代码
plt.imshow(data, extent=extent, origin='lower', aspect='equal') plt.box(False) nx.draw_networkx_nodes(G, pos=pos, node_color='green') plt.show()
参数说明
origin='lower':将图像原点设为左下角,和NetworkX绘图的坐标系统统一aspect='equal':强制图像保持原始宽高比,避免被坐标轴拉伸,确保节点和边的位置完全匹配
额外优化建议
如果不需要用内存buffer保存图像,也可以直接将边图保存为文件再加载,效果一致:
# 保存边图 plt.figure() nx.draw_networkx_edges(G, pos=pos) plt.box(False) plt.savefig('dodeca_edges.png', bbox_inches='tight', pad_inches=0) plt.close() # 加载并叠加节点 plt.imshow(plt.imread('dodeca_edges.png'), extent=extent, origin='lower', aspect='equal') nx.draw_networkx_nodes(G, pos=pos, node_color='green') plt.box(False) plt.show()
内容的提问来源于stack exchange,提问作者Amanda
相关产品推荐
相关产品推荐

