xarray绘制contourf报错ValueError:DataArray必须为二维数组
xarray绘制contourf报错"DataArray must be 2d"的原因及解决办法
问题背景
你的xarray Dataset结构如下:
<xarray.Dataset> Dimensions: (index: 16200) Coordinates: * index (index) int64 0 1 2 3 4 5 ... 16194 16195 16196 16197 16198 16199 LONG (index) float64 -179.0 -179.0 -179.0 -179.0 ... 179.0 179.0 179.0 LAT (index) float64 -89.0 -87.0 -85.0 -83.0 ... 83.0 85.0 87.0 89.0 Data variables: ELEVATION (index) float64 2.965e+03 2.915e+03 ... -3.822e+03 -3.392e+03 MOHO (index) float64 -3.888e+04 -3.888e+04 ... -1.457e+04 -1.457e+04 LAB (index) float64 -1.2e+05 -1.2e+05 ... -1.245e+05 -1.245e+05 RHO_C (index) float64 2.851e+03 2.851e+03 ... 2.806e+03 2.806e+03 RHO_L (index) float64 3.33e+03 3.33e+03 ... 3.35e+03 3.346e+03 RHO_SL (index) float64 3.437e+03 3.437e+03 ... 3.443e+03 3.443e+03 BOTTOM (index) float64 -4.1e+05 -4.1e+05 -4.1e+05 ... -4.1e+05 -4.1e+05 GEOID (index) float64 -0.81 5.01 4.78 0.15 ... 3.28 3.42 1.52 -0.73 FA (index) float64 0.82 38.25 36.06 -17.35 ... 6.77 13.84 3.85 -2.68 G_zz (index) float64 0.01 0.33 0.22 -0.08 ... 0.07 0.12 0.04 -0.0 G_xx (index) float64 0.04 -0.1 -0.1 -0.02 ... -0.12 -0.1 -0.06 -0.04 G_yy (index) float64 -0.12 -0.23 -0.12 0.1 ... 0.05 -0.02 0.02 0.04
执行绘图代码:
ds.LAB.plot.contourf()
触发错误:
ValueError: DataArray must be 2d
错误原因
- xarray的
contourf()是为二维网格数据设计的,要求数据变量必须以经度和纬度作为独立的维度(比如(lat, lon)这样的二维结构)。 - 你的Dataset中,LONG和LAT只是一维
index维度的附属坐标,不是独立的维度。xarray无法自动识别这种一维点集合对应的网格结构,因此会报错要求输入二维数组。
解决办法
方法1:转换为规则二维网格(适用于经纬度是规则间隔的情况)
从你的数据来看,经纬度是规则步长(经度-179到179,步长2;纬度-89到89,步长2),可以直接重塑为二维网格:
import xarray as xr import numpy as np # 提取唯一的经纬度值 unique_lons = ds.LONG.unique() unique_lats = ds.LAT.unique() # 将LAB数据重塑为(lat, lon)的二维数组 lab_2d = ds.LAB.values.reshape(len(unique_lats), len(unique_lons)) # 创建新的二维Dataset ds_2d = xr.Dataset( {"LAB": (["lat", "lon"], lab_2d)}, coords={"lon": unique_lons, "lat": unique_lats} ) # 正常绘制contourf ds_2d.LAB.plot.contourf()
方法2:插值为二维网格(适用于不规则点数据)
如果经纬度不是规则分布,可以先通过插值将一维点数据转换为二维网格:
# 先查看数据的散点分布(可选) ds.plot.scatter(x="LONG", y="LAT", hue="LAB") # 创建目标规则网格(示例:1°间隔) target_grid = xr.Dataset( coords={ "lon": np.arange(-179, 180, 1), "lat": np.arange(-89, 90, 1) } ) # 插值到目标网格 ds_interp = ds.interp_like(target_grid, method="linear") # 绘制contourf ds_interp.LAB.plot.contourf()
内容的提问来源于stack exchange,提问作者Geo_toto
相关产品推荐
相关产品推荐

