绘制具有可变坐标的 xarray 数据集

Plotting xarray datasets with variable coordinates

我正在尝试使用 xarray 在可变网格上绘制数据。存储我的数据的网格随时间变化,但保持相同的尺寸。

我希望能够在给定时间绘制它的一维切片。下面显示了我正在尝试做的玩具示例。

import xarray as xr
import numpy as np
import matplotlib.pyplot as plt

time = [0.1, 0.2] # i.e. time in seconds

# a 1d grid changes over time, but keeps the same dims
radius = np.array([np.arange(3),
                   np.arange(3)*1.2])

velocity = np.sin(radius) # make some random velocity field

ds = xr.Dataset({'velocity': (['time', 'radius'],  velocity)},
            coords={'r': (['time','radius'], radius), 
                    'time': time})

如果我尝试在不同的时间绘制它,即

ds.sel(time=0.1)['velocity'].plot()
ds.sel(time=0.2)['velocity'].plot()
plt.show()

但我希望它能复制我可以明确使用的行为 matplotlib。在这里它正确地绘制了当时的速度与半径的关系。

plt.plot(radius[0], velocity[0])
plt.plot(radius[1], velocity[1])
plt.show()

我可能用错了 xarray,但它应该是根据当时正确的半径值绘制速度。

我是否设置了错误的数据集或使用了错误的 plot/index 功能?

我同意这种行为是意外的,但它不完全是一个错误。

查看您要绘制的变量:

da = ds.sel(time=0.2)['velocity']
print(da)

产量:

<xarray.DataArray 'velocity' (radius: 3)>
array([ 0.      ,  0.932039,  0.675463])
Coordinates:
    r        (radius) float64 0.0 1.2 2.4
    time     float64 0.2
Dimensions without coordinates: radius

我们看到没有名为 radius 的坐标变量,而这正是 xarray 在为上面显示的图创建 x 坐标时所寻找的。在你的情况下,你需要一个简单的工作,我们将一维坐标变量重命名为与维度相同的名称:

for time in [0.1, 0.2]:
    ds.sel(time=time)['velocity'].rename({'r': 'radius'}).plot(label=time)

plt.legend()
plt.title('example for SO')