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

plt.quiver绘制风应力矢量图报错unhashable type: 'numpy.ndarray'

错误触发原因

报错核心来自两个代码逻辑问题:

  1. 你给x、y赋值的是经纬度变量的名称字符串,不是实际的经纬度数值数组:x="LON86_125"、y="LAT71_110"本质是两个文本值,传给np.meshgrid后生成的X、Y是字符串组成的数组,完全不包含坐标数值。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:36:25