如何更改 xarray 中坐标标签的顺序?
How do i change the order of the coordinate labels in xarray?
当我创建一个 xarray dataArray 时,我可以按照我想要的顺序设置坐标的标签,但是当我使用 .combine_first 从不同的数组向它添加一些数据时,它总是按字母顺序重新排序标签。然后我想在一个图表中用多个数据绘制一个面线图中的数据,这里我遇到了问题,坐标标签的顺序定义了哪条线被绘制在另一条线之上。有没有办法在我合并数据后重新排序标签,或者我如何选择将哪条线绘制在其他线之上?
这里有一个例子,坐标标签 'type' 的顺序不正确
import matplotlib.pyplot as plt
import xarray as xr
import numpy as np
import pandas as pd
data1 = np.random.randn(4, 4,3)
type = ["b", "c", "a", "d"]
loc= np.linspace(1,3,3)
times = pd.date_range("2000-01-01", periods=4)
foo = xr.DataArray(data1, coords=[times, type, loc], dims=["time", "type","loc"])
foo
Out[1]: <xarray.DataArray (time: 4, type: 4, loc: 3)>
array([[
...
]])
Coordinates:
* time (time) datetime64[ns] 2000-01-01 2000-01-02 2000-01-03 2000-01-04
* type (type) <U1 'b' 'c' 'a' 'd'
* loc (loc) float64 1.0 2.0 3.0
这里我制作第二个数组并将其与第一个数组组合:
data2=np.random.randn(4,1,3)
type2 =["b"]
loc2= np.linspace(1,3,3)
times2 = pd.date_range("2000-01-01", periods=4)
foo2 = xr.DataArray(data2, coords=[times2, type2, loc2,], dims=["time", "type","loc"])
foo2
comb=foo.combine_first(foo2)
comb
Out[2]:
<xarray.DataArray (time: 4, type: 4, loc: 3)>
array([[[-2.45206949e+00, -1.39563427e+00, 4.01038823e-01],
...
[-1.60937495e+00, 1.23864314e+00, -3.89573178e-01]]])
Coordinates:
* type (type) <U1 'a' 'b' 'c' 'd'
* time (time) datetime64[ns] 2000-01-01 2000-01-02 2000-01-03 2000-01-04
* loc (loc) float64 1.0 2.0 3.0
在 .combine_first 之后,标签 'a'、'b'、'c'、'd' 将按字母顺序重新排序。
这是我想要绘制它的方式以及我想要更改的线条顺序
t=comb.plot.line(x="time", col="loc", linewidth= 5, col_wrap=3)
Plot
您可以使用 DataArray.sel
根据您的喜好沿着坐标对数组进行排序(这里我使用的是您在问题中定义的 type
列表):
comb.sel(type=type).plot(x="time", col="loc", linewidth= 5, col_wrap=3)
当我创建一个 xarray dataArray 时,我可以按照我想要的顺序设置坐标的标签,但是当我使用 .combine_first 从不同的数组向它添加一些数据时,它总是按字母顺序重新排序标签。然后我想在一个图表中用多个数据绘制一个面线图中的数据,这里我遇到了问题,坐标标签的顺序定义了哪条线被绘制在另一条线之上。有没有办法在我合并数据后重新排序标签,或者我如何选择将哪条线绘制在其他线之上?
这里有一个例子,坐标标签 'type' 的顺序不正确
import matplotlib.pyplot as plt
import xarray as xr
import numpy as np
import pandas as pd
data1 = np.random.randn(4, 4,3)
type = ["b", "c", "a", "d"]
loc= np.linspace(1,3,3)
times = pd.date_range("2000-01-01", periods=4)
foo = xr.DataArray(data1, coords=[times, type, loc], dims=["time", "type","loc"])
foo
Out[1]: <xarray.DataArray (time: 4, type: 4, loc: 3)>
array([[
...
]])
Coordinates:
* time (time) datetime64[ns] 2000-01-01 2000-01-02 2000-01-03 2000-01-04
* type (type) <U1 'b' 'c' 'a' 'd'
* loc (loc) float64 1.0 2.0 3.0
这里我制作第二个数组并将其与第一个数组组合:
data2=np.random.randn(4,1,3)
type2 =["b"]
loc2= np.linspace(1,3,3)
times2 = pd.date_range("2000-01-01", periods=4)
foo2 = xr.DataArray(data2, coords=[times2, type2, loc2,], dims=["time", "type","loc"])
foo2
comb=foo.combine_first(foo2)
comb
Out[2]:
<xarray.DataArray (time: 4, type: 4, loc: 3)>
array([[[-2.45206949e+00, -1.39563427e+00, 4.01038823e-01],
...
[-1.60937495e+00, 1.23864314e+00, -3.89573178e-01]]])
Coordinates:
* type (type) <U1 'a' 'b' 'c' 'd'
* time (time) datetime64[ns] 2000-01-01 2000-01-02 2000-01-03 2000-01-04
* loc (loc) float64 1.0 2.0 3.0
在 .combine_first 之后,标签 'a'、'b'、'c'、'd' 将按字母顺序重新排序。 这是我想要绘制它的方式以及我想要更改的线条顺序
t=comb.plot.line(x="time", col="loc", linewidth= 5, col_wrap=3)
Plot
您可以使用 DataArray.sel
根据您的喜好沿着坐标对数组进行排序(这里我使用的是您在问题中定义的 type
列表):
comb.sel(type=type).plot(x="time", col="loc", linewidth= 5, col_wrap=3)