如何用xarray和cartopy绘制POP2(POP_gx1v7)网格数据?
解决CESM2 LENS2 POP2偏移极网格数据的Cartopy绘图问题
问题根源
POP2的偏移极网格属于非规则经纬度网格,imshow仅适用于均匀规则的网格,直接通过extent指定范围会导致高纬度网格单元的地理坐标匹配错误,最终出现海岸线与数据掩模偏移的问题。要保留原始网格单元,必须使用支持非规则坐标的绘图方法。
解决方案(优先保留Xarray功能)
以下两种方法均基于Xarray接口,结合Cartopy实现精准绘图:
方法1:Xarray内置plot.pcolormesh(最简便)
直接利用Xarray的绘图接口,自动关联非规则经纬度坐标,无需手动处理网格匹配:
import xarray as xr import matplotlib.pyplot as plt import cartopy.crs as ccrs # 提取表层温度场(假设ds_temp已加载) field = ds_temp.TEMP.isel(time=0, z_t=0) # 创建带Cartopy投影的画布 fig, ax = plt.subplots(figsize=(12, 6), subplot_kw={'projection': ccrs.PlateCarree()}) # 绘制非规则网格数据,指定经纬度坐标和坐标转换 field.plot.pcolormesh( ax=ax, x='TLONG', y='TLAT', transform=ccrs.PlateCarree(), # TLONG/TLAT为WGS84经纬度 add_colorbar=True, cmap='viridis', rasterized=True # 优化大网格渲染速度 ) # 添加高分辨率海岸线匹配细节 ax.coastlines(resolution='50m') plt.show()
方法2:结合Matplotlibpcolormesh自定义绘图
如果需要更精细的绘图控制,可直接调用Matplotlib的pcolormesh,同时保留Xarray的数据结构:
field = ds_temp.TEMP.isel(time=0, z_t=0) fig = plt.figure(figsize=(12, 6)) ax = plt.axes(projection=ccrs.PlateCarree()) # 传入原始经纬度数组,匹配每个网格单元的地理位置 cs = ax.pcolormesh( ds_temp.TLONG, ds_temp.TLAT, field, transform=ccrs.PlateCarree(), cmap='viridis' ) # 添加颜色条和海岸线 plt.colorbar(cs, ax=ax, orientation='horizontal', pad=0.05) ax.coastlines(resolution='50m') plt.show()
高纬度区域优化(北纬60°以北)
若重点关注北欧/北极区域,可切换极地投影提升可视化效果:
fig, ax = plt.subplots(figsize=(10, 10), subplot_kw={'projection': ccrs.NorthPolarStereo()}) field.plot.pcolormesh( ax=ax, x='TLONG', y='TLAT', transform=ccrs.PlateCarree(), add_colorbar=True, cmap='viridis' ) # 限定显示范围为北纬60°以北 ax.set_extent([-180, 180, 60, 90], crs=ccrs.PlateCarree()) ax.coastlines(resolution='50m') ax.gridlines(draw_labels=True) # 添加极地网格标签 plt.show()
关键注意事项
- 禁止使用
imshow:该函数仅支持规则网格,无法适配POP2的偏移极坐标。 - 坐标维度匹配:确保
TLONG、TLAT与数据变量的维度(nlat×nlon)完全一致。 - 海岸线分辨率:选择
50m或10m分辨率,可提升高纬度区域的细节匹配度。
内容的提问来源于stack exchange,提问作者Ina
相关产品推荐
相关产品推荐

