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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:36:29