cartopy正射投影(Orthographic)绘图如何设置统一的extent轴范围
问题原因
你调用get_extent和set_extent时传入的crs = proj()是无参数的默认正射投影实例(默认中心点为经度0、纬度0),和你实际绘图使用的proj(lon, lat)(中心点为经度-90、纬度90的正射投影)不属于同一坐标系,提取的extent本身就是错的,应用后自然无法得到预期效果。
正确操作步骤
1. 提取基准图extent
直接从绘制好的基准轴对象获取当前投影下的extent即可,不需要额外指定crs(默认返回当前轴投影坐标系下的范围值):
# 基准图绘制代码和原有逻辑一致 import matplotlib.pyplot as plt import cartopy.crs as ccrs lon = -90 lat = 90 proj = ccrs.Orthographic projection = proj(lon, lat) fig = plt.figure() ax = fig.add_subplot(1, 1, 1, projection = projection) transform = ccrs.Geodetic() lat0 = 50 lon0 = 50 for x in range(-5,6): plt.plot(lon0 + x, lat0, 'bo', transform = transform) plt.plot(lon0, lat0 + x, 'bo', transform = transform) # 关键:提取当前轴投影下的extent保存 target_extent = ax.get_extent()
2. 复用extent到其他地图
只要保证其他地图的投影参数和基准图完全一致,调用set_extent传入保存的范围即可:
# 新建第二幅图,投影参数和基准图完全一致 fig2 = plt.figure() ax2 = fig2.add_subplot(1, 1, 1, projection=proj(lon, lat)) # 直接用之前保存的extent ax2.set_extent(target_extent, crs=projection) # 此处绘制其他内容,范围会和第一幅图完全一致 for x in range(-5,6): plt.plot(lon0 + x, lat0 + 2, 'ro', transform = transform) plt.plot(lon0, lat0 + x + 2, 'ro', transform = transform) plt.show()
注意事项
- 所有需要统一范围的地图,投影参数(中心点、椭球等)必须完全和基准图一致,否则extent复用会错位
- 如果需要跨投影复用范围,需要先把extent的四个边界值转换到目标投影坐标系下再调用
set_extent
内容的提问来源于stack exchange,提问作者ramzeek
相关产品推荐
相关产品推荐

