我有以下xarray数据集,具有3个维度(time
,latitude
,longitude
)和2个变量(__xarray_dataarray_variable__
,regions
)。 regions
变量可以是nan,0、1、2、3、4或5,表示经纬度的区域ID。 __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
。每行代表一个区域ID。
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.
如何使用xarray绘图功能绘制一个包含所有6个区域的线条的单个图形,而不是每个图形的单个图形?
答案 0 :(得分:0)
我想我知道您在寻找什么。这就是我要处理的方式。我将首先按照您的样式设置一些数据:
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')
在这里,我们选择创建自己的图例,以尽可能地控制其位置和格式。这样会产生如下图:
可以找到更多的线图示例here。