Построение наборов данных xarray с переменными координатами

Я пытаюсь использовать xarray для построения данных в переменной сетке. Сетка, в которой хранятся мои данные, со временем меняется, но сохраняет те же размеры.

Я хотел бы иметь возможность строить 1d срезы в определенный момент времени. Ниже показан игрушечный пример того, что я пытаюсь сделать.

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()

версия графика xarray

Но я бы хотел, чтобы он воспроизводил поведение, которое я могу сделать явно с помощью matplotlib. Здесь он правильно отображает скорость в зависимости от радиуса в это время.

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

правильная версия сюжета

Возможно, я неправильно использую xarray, но он должен строить график скорости против правильного значения радиуса в то время.

Я неправильно настраиваю набор данных или неправильно использую функцию построения / индекса?


person smillerc    schedule 03.08.2017    source источник


Ответы (1)


Я согласен, что такое поведение неожиданно, но это не совсем ошибка.

Глядя на переменные, которые вы пытаетесь построить:

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 для графиков, которые вы показали выше. В вашем случае вам нужна простая работа, где мы переименовываем 1-D координатную переменную с тем же именем, что и размер:

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')

введите здесь описание изображения

person jhamman    schedule 04.08.2017
comment
Есть ли лучший способ структурировать мой набор данных, чтобы избежать этого? Это кажется лишним ... - person smillerc; 04.08.2017
comment
@smillerc - Не совсем. Как упоминалось в опубликованном вами выпуске github, мы, вероятно, сможем сделать это в коде построения графика xarray, но мой ответ кажется лучшим подходом для текущей версии. - person jhamman; 09.08.2017