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

pcolormesh维度不兼容报错:ERA5-Land地面风场绘图求助

解决pcolormesh维度不兼容问题的方案

问题核心

报错的本质是**pcolormesh的维度规则**:当指定shading='flat'时,数据C的维度需要比网格X/Y小一维(即C为(N-1, M-1),X/Y为(N, M))。你的data和x/y维度完全一致(都是(1801, 3600)),不符合flat着色的要求。另外ERA5-Land的纬度默认是从北到南排列,和网格的纬度方向可能不匹配,也会加剧维度冲突。

修复步骤

1. 调整着色模式(最简单的解法)

改用shading='auto'或shading='nearest',这两种模式允许C和X/Y维度完全一致:

cs = m.pcolormesh(x, y, data, shading='auto', cmap=plt.cm.gist_stern_r)

2. 修正纬度方向

ERA5-Land的GRIB数据纬度是从90°N到-90°S递减排列的,需要反转纬度数组和数据的纬度维度,确保和网格方向匹配:

# 反转纬度数组,从南到北排列
lats = np.linspace(float(grb['latitudeOfFirstGridPointInDegrees']), 
                   float(grb['latitudeOfLastGridPointInDegrees']), 
                   int(grb['Nj']))[::-1]
# 同步反转数据的纬度维度
data = data[::-1, :]

3. 完整修正代码

import pygrib
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from mpl_toolkits.basemap import shiftgrid
import numpy as np
 
plt.figure(figsize=(12,8))
 
grib = 'adaptor.mars.internal-1669570066.0148444-9941-17-702abb2d-e37e-4ef7-a19e-a04fb24e5a20.grib'
grbs = pygrib.open(grib)
 
grb = grbs.select()[0]
data = grb.values
 
# 修正纬度方向
lons = np.linspace(float(grb['longitudeOfFirstGridPointInDegrees']), 
                   float(grb['longitudeOfLastGridPointInDegrees']), 
                   int(grb['Ni']))
lats = np.linspace(float(grb['latitudeOfFirstGridPointInDegrees']), 
                   float(grb['latitudeOfLastGridPointInDegrees']), 
                   int(grb['Nj']))[::-1]
data = data[::-1, :]

# 转换经度范围到-180~180
data, lons = shiftgrid(180., data, lons, start=False)
grid_lon, grid_lat = np.meshgrid(lons, lats)
 
m = Basemap(projection='cyl', llcrnrlon=-180, 
            urcrnrlon=180.,llcrnrlat=lats.min(),urcrnrlat=lats.max(), 
            resolution='c')
    
m.drawcoastlines()
m.drawmapboundary()
m.drawparallels(np.arange(-90.,120.,30.),labels=[1,0,0,0])
m.drawmeridians(np.arange(-180.,180.,60.),labels=[0,0,0,1])
    
x, y = m(grid_lon, grid_lat)

# 使用auto着色模式解决维度问题
cs = m.pcolormesh(x, y, data, shading='auto', cmap=plt.cm.gist_stern_r)
 
plt.colorbar(cs,orientation='vertical', shrink=0.5)
plt.title('ERA5-Land 地面风速')
plt.savefig(grib+'.png')

额外补充

  • 若坚持用shading='flat',需要对所有数组裁剪最后一行和一列:
    cs = m.pcolormesh(x[:-1, :-1], y[:-1, :-1], data[:-1, :-1], shading='flat', cmap=plt.cm.gist_stern_r)
    
  • 风场包含u(东向)、v(北向)分量,若要绘制风矢量,需同时读取两个分量:
    # 读取u、v分量并修正维度
    u_grb = grbs.select(name='10 metre U wind component')[0]
    v_grb = grbs.select(name='10 metre V wind component')[0]
    u_data = u_grb.values[::-1, :]
    v_data = v_grb.values[::-1, :]
    u_data, _ = shiftgrid(180., u_data, lons, start=False)
    v_data, _ = shiftgrid(180., v_data, lons, start=False)
    # 间隔采样绘制风矢量,避免过密
    m.quiver(x[::20,::20], y[::20,::20], u_data[::20,::20], v_data[::20,::20], scale=500)
    

内容的提问来源于stack exchange,提问作者Samuel B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:30:54