plt.quiver绘制风应力矢量图报错unhashable type: 'numpy.ndarray'
错误触发原因
报错核心来自两个代码逻辑问题:
- 你给
x、y赋值的是经纬度变量的名称字符串,不是实际的经纬度数值数组:x="LON86_125"、y="LAT71_110"本质是两个文本值,传给np.meshgrid后生成的X、Y是字符串组成的数组,完全不包含坐标数值。 plt.quiver接收到字符串类型的坐标数组时,cartopy的绘图逻辑会尝试把字符串输入当成数据集的键去索引对应数据,但numpy.ndarray类型不可哈希,无法作为字典键使用,直接触发unhashable type: 'numpy.ndarray'报错。
另外还有一个隐藏兼容问题:计算得到的U、V是xarray DataArray类型,未显式提取数值的话,偶尔会和matplotlib参数解析逻辑出现类型冲突。
修复后的可运行代码
import xarray as xr import numpy as np import matplotlib.pyplot as plt import cartopy.crs as ccrs # 数据读取逻辑保持不变 paths = ["i stress.nc", "j stress.nc"] DS = xr.open_mfdataset(paths) # 创建等经纬度投影坐标轴 ax = plt.axes(projection=ccrs.PlateCarree()) # 计算时间平均风应力,通过.values提取numpy数组规避类型兼容问题 U = DS.SOZOTAUX.mean(dim='TIME').values V = DS.SOMETAUY.mean(dim='TIME').values # 从数据集里提取实际的经纬度数值数组,不要直接传变量名字符串 x = DS["LON86_125"].values y = DS["LAT71_110"].values # 生成坐标网格,输出形状和U/V的(纬度,经度)维度完全匹配 X, Y = np.meshgrid(x, y) # 绘制风矢,显式指定坐标投影避免cartopy识别错误 plt.quiver(X, Y, U, V, transform=ccrs.PlateCarree()) # 按需添加辅助要素 ax.coastlines() plt.show()
额外注意事项
- 如果运行时提示维度不匹配,检查经纬度长度和U/V对应维度的对应关系:如果U的维度顺序是(经度,纬度),把
np.meshgrid的参数顺序调换为np.meshgrid(y, x)即可。 - 风矢过于密集影响观感时,可以给数组加步长切片降采样,例如传入
X[::2,::2], Y[::2,::2], U[::2,::2], V[::2,::2],每2个点取1个绘制即可。
内容的提问来源于stack exchange,提问作者Sougata
相关产品推荐
相关产品推荐

