【发布时间】:2021-02-16 05:23:11
【问题描述】:
我正在尝试绘制一个二维 xarray DataArray 表示在极坐标中参数化的变量。 重要提示:theta 坐标是度数,不是弧度。下面的 sn -p 创建一个示例数据集:
import numpy as np
import xarray as xr
res_theta = 20
thetas = np.arange(0, 360, res_theta)
res_r = 0.1
rs = np.arange(0, 1, res_r)
data = np.random.random((len(thetas), len(rs)))
my_da = xr.DataArray(
data,
coords=(thetas, rs),
dims=("theta", "r"),
)
我想将此数据绘制为极坐标pcolormesh。我还想依靠 xarray 的绘图例程来从尽可能多的功能(刻面、绘图定制等)中受益。 Matplotlib 的极坐标投影假定theta 角度以弧度表示:如果我采用简单的解决方案,我首先必须将theta 坐标转换为弧度,但我不想就地修改数组。我没有找到比复制数组并转换副本的theta 更好的方法,例如:
def pcolormesh_polar_expensive(da, *args, **kwargs):
da_tmp = da.copy() # I'd like to avoid that
# Get x value
try:
x = args[0]
except IndexError:
x = da_tmp.dims[0]
da_tmp[x] = np.deg2rad(da_tmp[x])
try:
subplot_kws = kwargs["subplot_kws"]
except KeyError:
subplot_kws = {}
return da_tmp.plot.pcolormesh(
*args,
subplot_kws=dict(projection="polar"),
**kwargs
)
这会产生所需的情节:
pcolormesh_polar_expensive(my_da, "theta", "r")
实际问题
但是,我想避免重复数据:我的实际数据集比这大得多。我做了一些研究,发现了 Matplotlib 的转换管道,我觉得我可以用它在绘图例程中动态插入这个转换,但到目前为止我无法正常工作。有人知道我该如何进行吗?
【问题讨论】:
-
您可以将包含弧度值的另一个(例如 theta2)坐标添加到 DataArray 并使用它进行绘图。这样您就不必更改原始坐标。
-
我想过,但如果可能的话,我想避免修改数据。
-
数据不会被修改。将添加一个新坐标,不会更改原始数据和坐标。我对您的工作流程一无所知,但如果您为每个 DataArray 创建一次附加坐标(甚至更好,在数据集级别),则只需计算一次。如果您尝试将其放入 matplotlib 转换管道中,则必须为每个绘图计算它。
标签: python matplotlib python-xarray polar-coordinates