matplotlib pcolormesh报错:数组未掩码却提示存在非有限值
问题:Basemap绘制NetCDF气温数据时pcolormesh报错
我尝试使用matplotlib和Basemap绘制NetCDF文件中的气温数据,初始代码如下:
fig = plt.figure(figsize=(10, 8)) m = Basemap(projection='lcc', resolution='c', width=8E6, height=8E6, lat_0=45, lon_0=-100,) m.shadedrelief(scale=0.5) m.pcolormesh(lon2, lat2, t2m, latlon=True, cmap='RdBu_r') plt.clim(-8, 8) m.drawcoastlines(color='lightgray') plt.title('January 2014 Temperature Anomaly') plt.colorbar(label='temperature anomaly (°C)');
但持续收到错误:错误指向pcolormesh代码行,提示X和Y不能包含非有限值或为掩码数组。不过我通过np.ma.is_masked(lon2)和np.ma.is_masked(lat2)检测,结果均为False,且两个数组均无无穷值或NaN。
更新:完整代码及数据说明
完整代码如下:
from netCDF4 import Dataset %matplotlib inline import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap data = Dataset('ERA5_1959.nc') lat = data.variables['latitude'][:] lon = data.variables['longitude'][:] lon, lat = np.meshgrid(lon, lat) t2m = data.variables['t2m'][1,1,:,:] #temp data #create non-masked arrays lon2 = lon.filled() lat2 = lat.filled() #plot fig = plt.figure(figsize=(10, 8)) m = Basemap(projection='lcc', resolution='c', width=8E6, height=8E6, lat_0=45, lon_0=-100,) m.shadedrelief(scale=0.5) m.pcolormesh(lon2, lat2, t2m2, latlon=True, cmap='RdBu_r') plt.clim(-8, 8) m.drawcoastlines(color='lightgray') plt.title('January 2014 Temperature Anomaly') plt.colorbar(label='temperature anomaly (°C)');
数据文件为ERA5_1959.nc。
解决建议
- 修正变量名拼写错误:代码中调用
pcolormesh时使用了t2m2,但实际定义的气温变量是t2m,这是明显笔误,先将t2m2改为t2m。 - 检查气温数组
t2m的有效性:虽然经纬度数组没问题,但t2m可能存在非有限值或掩码。执行以下代码检查:
如果存在无效值,可使用print(np.isnan(t2m).any()) print(np.ma.is_masked(t2m))t2m = np.ma.filled(t2m, np.nan)填充掩码值,或通过t2m = np.where(np.isfinite(t2m), t2m, np.nan)过滤非有限值。 - 验证投影范围匹配度:当前使用的LCC投影中心为(45°N, -100°W),宽度和高度均为800万公里。先打印经纬度范围:
如果数据超出投影覆盖区域,会导致坐标转换失败。可先改用圆柱投影(print(f"lon范围: {lon2.min()} ~ {lon2.max()}") print(f"lat范围: {lat2.min()} ~ {lat2.max()}")projection='cyl')测试,确认数据能正常绘制后再调整LCC参数。 - 替换绘图函数测试:
pcolormesh对坐标格式要求较严格,可尝试用contourf替代验证:m.contourf(lon2, lat2, t2m, latlon=True, cmap='RdBu_r') - 检查版本兼容性:Basemap对matplotlib 3.3及以上版本支持不佳,若使用高版本matplotlib,建议降级到3.2.x版本,同时确保Basemap版本为1.2.2。
内容的提问来源于stack exchange,提问作者lexipalmer
相关产品推荐
相关产品推荐

