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
相关产品推荐
相关产品推荐

