You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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()

问题现象

  1. 未设置set_global的Cartopy-Robinson全球数据图
    cartopy-robinson global data with no set_global option

  2. 未设置范围的纬度切片Cartopy-Robinson数据图
    cartopy-robinson latitude-sliced data with no extent setting

  3. 设置set_global的纬度切片Cartopy-Robinson数据图
    cartopy-robinson latitude-sliced data with set_global() option

解决方案

问题根源

当使用纬度切片数据且未指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:58:22