为何Cartopy的Robinson投影在不同中央经度下边界不对称?
Cartopy Robinson投影不同中央经度下边界不对称问题解决
问题描述
使用Cartopy 0.21.0绘制Robinson投影的全球数据图时,选择不同中央经度值出现左右边界不对称问题:中央经度为-110、-120、-130时显示正常,值更小(如-140、-150、-160)时边界不对称。已使用add_cyclic_point函数对全球数据进行纬向循环扩展,尝试设置地图范围但未解决。
核心代码
import matplotlib.pyplot as plt import xarray as xr import cartopy.crs as ccrs from cartopy.util import add_cyclic_point fname = 'sst.nc' with xr.open_dataset(fname) as f: sst = f['sst'].isel(time=0) sst = sst.sel(lat=slice(-60,60)) lonc = [-110, -120, -130, -140, -150,-160] for i in range(6): ax = plt.subplot(321+i, projection=ccrs.Robinson(central_longitude=lonc[i])) # 纬向循环扩展数据 wsst, wlon = add_cyclic_point(sst, coord=sst.lon.data) handle = ax.contourf(wlon, sst.lat, wsst, transform=ccrs.PlateCarree()) ax.set_title('lon-cent = {:d}'.format(lonc[i])) ax.coastlines(resolution='110m', color='0.7', lw=1) ax.axhline(0, ls='--', color='k', lw=0.8) #ax.set_global() plt.show()
问题现象
未设置
set_global的Cartopy-Robinson全球数据图
未设置范围的纬度切片Cartopy-Robinson数据图

设置
set_global的纬度切片Cartopy-Robinson数据图
解决方案
问题根源
当使用纬度切片数据且未指定set_global()时,Cartopy自动计算的绘图范围会因中央经度偏移过大,导致边界无法对称对齐;而set_global()会强制显示完整全球范围,包含不需要的高纬度区域。
解决方法
手动设置投影的经纬度范围,确保经度对称覆盖全球,同时限制目标纬度区间:
修改后的循环部分代码:
for i in range(6): proj = ccrs.Robinson(central_longitude=lonc[i]) ax = plt.subplot(321+i, projection=proj) # 纬向循环扩展数据 wsst, wlon = add_cyclic_point(sst, coord=sst.lon.data) handle = ax.contourf(wlon, sst.lat, wsst, transform=ccrs.PlateCarree()) # 手动设置对称范围:纬度限制-60到60,经度以中央经度为中心覆盖全球 ax.set_extent([lonc[i]-180, lonc[i]+180, -60, 60], crs=ccrs.PlateCarree()) ax.set_title('lon-cent = {:d}'.format(lonc[i])) ax.coastlines(resolution='110m', color='0.7', lw=1) ax.axhline(0, ls='--', color='k', lw=0.8)
原理说明
通过set_extent()指定以PlateCarree()为基准的经纬度范围:
- 经度范围设为
[中央经度-180, 中央经度+180],确保完整覆盖全球且左右对称 - 纬度范围限制在
[-60,60],匹配数据切片需求
这样Cartopy会根据Robinson投影参数自动调整显示区域,保证不同中央经度下图像左右边界完全对称。
内容的提问来源于stack exchange,提问作者ChaoLiu
相关产品推荐
相关产品推荐

