matplotlib与geopandas:transData.transform运行与调试结果不一致?
问题原因分析
这是因为Matplotlib的transData坐标变换依赖于绘图区域的最终渲染状态,你的代码在直接运行时,还没等Matplotlib完成完整的布局渲染流程就执行了坐标变换计算,导致结果不准确。
- 直接运行代码时,程序执行速度快,调用
transData.transform()时,Matplotlib还没来得及根据绘制的图形完成轴范围调整、布局适配等渲染步骤,此时transData使用的是初始临时布局参数,计算出的自然是错误结果。 - 断点调试时,程序暂停的过程给了Matplotlib足够时间完成渲染流程,此时
transData已经基于最终的绘图状态生成了正确的坐标映射关系,所以调试得到的结果是准确的。
解决方法
要确保transData使用最终渲染后的状态,只需在获取坐标变换前强制Matplotlib完成画布渲染,添加一行代码即可:
fig.canvas.draw() # 强制画布完成渲染,更新布局状态
修改后的完整代码:
import matplotlib.pyplot as plt import geopandas as gpd from shapely.geometry import Polygon fig, ax = plt.subplots(3, 2, figsize=(40, 40)) dummyPoly = Polygon([[800, 800],[800,-800],[-800,-800]]) dummyGDF = gpd.GeoDataFrame(index=[0], geometry=[dummyPoly], crs='EPSG:4326') ax[0,0] = dummyGDF.plot(ax=ax[0,0]) fig.canvas.draw() # 新增:强制完成渲染 axisLimits=ax[0,0].axes.get_xlim() t=ax[0,0].transData.transform((axisLimits[1],0))[0] print(t)
这样无论直接运行还是调试,都能得到正确结果。
内容的提问来源于stack exchange,提问作者JoScratcherJo
相关产品推荐
相关产品推荐

