Как отобразить несколько объектов массива данных xarray в одну фигуру, используя возможность построения графика xarray?

#python #numpy #matplotlib #python-xarray

#python #numpy #matplotlib #python-xarray

Вопрос:

У меня есть следующий набор данных xarray с 3 измерениями ( time , latitude , longitude ) и 2 переменными ( __xarray_dataarray_variable__ , regions ). regions Переменная может быть либо nan, 0, 1, 2, 3, 4, или 5, указывающий идентификатор региона для широты /широты. __xarray_dataarray_variable__ Переменная имеет целое число.

 <xarray.Dataset>
Dimensions:                        (latitude: 106, longitude: 193, time: 92)
Coordinates:
  * latitude                       (latitude) float32 -39.2 -39.149525 ... -33.9
  * longitude                      (longitude) float32 140.8 140.84792 ... 150.0
  * time                           (time) datetime64[ns] 1972-01-01 ... 2017-07-01
Data variables:
    __xarray_dataarray_variable__  (time, latitude, longitude) int32 dask.array<shape=(92, 106, 193), chunksize=(2, 106, 193)>
    regions                        (latitude, longitude) float64 nan nan ... nan
  

Я хотел бы построить фигуру, которая содержит 6 строк и где ось Y — это среднее пространственное значение __xarray_dataarray_variable__ , а ось X — это time . Каждая строка предназначена для одного идентификатора региона.

 da = ds["__xarray_dataarray_variable__"]

# Region 0
da_region_0 = da.where(ds.regions == 0)
da_region_0_mean = da_region.mean(['longitude', 'latitude'])  # Get spatial mean

# We can follow the example to get da for region 1 - region 5.
... ...
p_mean = da_region_0_mean.plot.line(x='time')  # This is only plotting a figure for each region but not all 6 regions.
  

Как я могу отобразить одну единственную фигуру, содержащую строки для всех 6 областей, вместо отдельных фигур для каждой, используя возможность построения графика xarray?

Комментарии:

1. Вы пытались создать фигуру и указать ее ось для каждого из ваших линейных графиков? Это должно помочь, если вы хотите наложить несколько графиков xarray на один рисунок

Ответ №1:

Я думаю, я понимаю, что вы ищете. Я бы подошел к этому именно так. Сначала я настрою некоторые данные в вашем стиле:

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

data = np.random.random((6, 3, 11))
da = xr.DataArray(data, dims=['longitude', 'latitude', 'time'], name='foo')

region_data = np.random.choice(range(6), size=(6, 3))
region = xr.DataArray(region_data, dims=['longitude', 'latitude'], name='region')

ds = xr.merge([da, region])
  

Этот набор данных, ds , выглядит как:

 <xarray.Dataset>
Dimensions:  (latitude: 3, longitude: 6, time: 11)
Dimensions without coordinates: latitude, longitude, time
Data variables:
    foo      (longitude, latitude, time) float64 0.7016 0.1519 ... 0.1446 0.2396
    region   (longitude, latitude) int64 5 1 1 5 0 1 0 0 2 3 0 4 4 3 3 1 2 1
  

Чтобы вычислить региональные средние, мы можем сначала сложить измерения долготы и широты набора данных:

 stacked = ds.stack(xy=('longitude', 'latitude'))
  

Это позволит нам легко использовать groupby группировку по номеру региона при вычислении среднего:

 regional_means = stacked.foo.groupby(stacked.region).mean('xy')
  

Для построения графика мы можем использовать xarray.DataArray.plot.line вместе с аргументом hue ключевого слова для создания единой панели с линиями временных рядов для каждого региона:

 lines = regional_means.plot.line(hue='region', add_legend=False)
labels = range(6)
plt.legend(lines, labels, ncol=2, loc='lower right')
  

Здесь мы решили создать нашу собственную легенду, чтобы дать нам как можно больше контроля над ее положением и форматом. Это создает такой график:

Многострочный график

Другие примеры построения графиков можно найти здесь .