Python cartopy正交投影场景下imshow的set_data方法投影失效问题
问题原因
- 调用
ax.imshow()传入cartopy的transform参数时,cartopy会内部完成地理坐标到目标投影的映射计算,同步固化坐标转换规则、数据边界等参数到返回的im对象中,仅调用set_data()只会更新像素数值,不会触发投影逻辑的重计算,因此出现投影失效问题。 - 直接调用
im.set_transform(ccrs.PlateCarree())属于用法错误:set_transform接收的是matplotlib原生的变换对象,直接传入cartopy的CRS对象会跳过地理投影适配流程,导致数据范围、显示位置异常,看起来数值偏小实际是大部分数据被裁剪到了可视区域外。
解决方案
方案1:保留im对象更新,手动补全投影参数
适合高频更新场景,性能开销更小:
import numpy as np import cartopy.crs as ccrs import matplotlib.pyplot as plt np.random.seed(100) fig = plt.figure() ax = fig.add_subplot(projection=ccrs.Orthographic()) # 首次绘制 im = ax.imshow(np.random.rand(20,20), transform=ccrs.PlateCarree()) # 提前保存初始extent和转换对象,避免重复计算 init_extent = im.get_extent() init_transform = im.get_transform() plt.savefig('1.png') # 更新数据 im.set_data(np.random.rand(20,20)) # 恢复投影参数 im.set_transform(init_transform) im.set_extent(init_extent, crs=ccrs.PlateCarree()) plt.savefig('2_fixed.png')
方案2:重建图像对象
适合低频率更新场景,代码简洁兼容性高,不会出现参数错乱问题:
import numpy as np import cartopy.crs as ccrs import matplotlib.pyplot as plt np.random.seed(100) fig = plt.figure() ax = fig.add_subplot(projection=ccrs.Orthographic()) # 首次绘制 im = ax.imshow(np.random.rand(20,20), transform=ccrs.PlateCarree()) plt.savefig('1.png') # 更新时先移除旧对象 im.remove() # 重新绘制新数据 im = ax.imshow(np.random.rand(20,20), transform=ccrs.PlateCarree()) plt.savefig('2_fixed.png')
内容的提问来源于stack exchange,提问作者SGH
相关产品推荐
相关产品推荐

