xarray--一维空间绘图学习记录

Simple Example

  • dataarrays 最简单的画图方法就是调用dataarray.plot()
  • xarray 可以通过使用坐标名称或者数据名称进行数据索引,如 attrs.long_name, attrs.standard_name, DataArray.name and attrs.units ,而这些名称可以通过dataarray.attrs命令获得,示例如下:
sst.attrs
{'long_name': 'Monthly Mean of Sea Surface Temperature',
 'unpacked_valid_range': array([-5., 40.], dtype=float32),
 'actual_range': array([-1.7999996, 35.56862  ], dtype=float32),
 'units': 'degC',
 'precision': 2,
 'var_desc': 'Sea Surface Temperature',
 'dataset': 'NOAA Optimum Interpolation (OI) SST V2',
 'level_desc': 'Surface',
 'statistic': 'Mean',
 'parent_stat': 'Weekly Mean',
 'standard_name': 'sea_surface_temperature',
 'cell_methods': 'time: mean (monthly from weekly values interpolated to daily)',
 'valid_range': array([-500, 4000], dtype=int16)}

调用dataarray.plot()方法进行快速绘图:

sst1 =sst.isel(lat=10, lon=10)
sst1.plot()

在这里插入图片描述

除此之外,还可以绘制一些其他的绘图功能。例如,通过xarray.plot.line()命令调用matplotlib.pyplot.plot功能,分别传递索引和数组中的x,y值。例如,用蓝线绘制三角形matplotlib格式字符串可以使用:

sst1[:200].plot.line("b-^")

在这里插入图片描述

注意!:不是所有的xarray 绘图都支持传递位置的参数,但是都支持关键字功能。关键字参数调用使用相同的方式,且更明确。如所示:

sst1[:200].plot.line(color="purple", marker="o")

在这里插入图片描述

Adding to Existing Axis

添加绘图到一个现有的坐标轴,并作为一个关键字:ax。这对所有的xaray绘图方法都适用,在下面这个例子中axes是一个由plt.subplots数组组成的左轴和右轴。

fig, axes = plt.subplots(ncols=2)

axes

air1d.plot(ax=axes[0])

air1d.plot.hist(ax=axes[1])

plt.tight_layout()

plt.draw()

在这里插入图片描述

右边是一个直方图由xarray.plot.hist ()绘制。

Controlling the figure size:控制图的大小

通过传递figsieze来控制图片的大小。为了方便起见,xarray的绘图方法还支持aspect和size控制生成图像的大小通过公式figsize =(aspect*size,size)

sst1.plot(aspect=2, size=3)

plt.tight_layout()

在这里插入图片描述

Determine x-axis values

每个默认维度坐标用于 x 轴(这里是时间坐标)。但是,您也可以沿 x 轴使用非维度坐标、多索引级别和没有坐标的维度。为了说明这一点,让我们从时间中计算一个“小数日”(epoch) ,并将其分配为一个非维度坐标:
每个默认维度坐标用于 x 轴(这里意思就是说将时间坐标作为x坐标轴)。但是,也可以沿 x 轴使用非维度坐标、多索引级别和没有坐标的维度。为了说明这一点,让我们从时间中计算一个“小数日”(epoch) ,并将其分配为一个非维度坐标:

decimal_day = (sst1.time - sst1.time[0]) / pd.Timedelta("1d")

sst1_multi = sst1.assign_coords(decimal_day=("time", decimal_day.data))

sst1_multi

在这里插入图片描述

使用 ‘decimal_day’ 作为 x 坐标,必须明确指定:

sst1_multi.plot(x="decimal_day")

在这里插入图片描述
从“ time”和“ decimal _ day”创建一个名为“ date”的新 MultiIndex,也可以使用 MultiIndex 级别作为 x 轴:

sst1_multi = sst1_multi.set_index(date=("time", "decimal_day"))

sst1_multi.plot(x="decimal_day")

最后,如果数据集没有任何坐标,它将枚举所有数据点:

sst1_multi = sst1_multi.drop("date")

sst1_multi.plot()

在这里插入图片描述
同样的情况也适用于下面的二维图。

Multiple lines showing variation along a dimension :多条线显示一个维度上的变化

通过使用适当的参数调用 xary.plot.line () ,可以对二维数据绘制线图。考虑上面定义的三维变量。我们可以用直线图来检查经线上三个不同纬度地区的气温变化:

sst.isel(lon=10, lat=[19, 21, 22]).plot.line(x="time")

在这里插入图片描述
它需要明确的指定:

  • 1 x:用于x轴的维度
  • 2 hue(色调):要用多条线表示的维度
    因此,我们可以通过指定 hue = lat而不是 x = ‘time来绘制前面的图。如果需要,可以使用 add _ legend = False 关闭自动图例。或者,可以直接传递给 xary.plot.line (): sst.isel (lon = 10,lat = [19,21,22]).plot.line (hue ='lat')

在这里插入图片描述

Dimension along y-axis :沿着y轴的维度

还可以绘制线图,使数据在 x 轴上,维度在 y 轴上。这可以通过指定适当的 y 关键字参数来实现。

sst.isel(time=10, lon=[10, 11]).plot(y="lat", hue="lon")

在这里插入图片描述

Step plots :步骤图

作为替代方案,也可以使用1维数据绘制类似 matplotlibplt.step

sst1[:20].plot.step(where="mid")

在这里插入图片描述
参数 where 定义了步骤应该放在哪里,选项是“ pre”(默认值)、“ post”和“ mid”。当绘制与 Dataset.groupby _ bin ()分组的数据时,这尤其方便。

sst_grp = sst.mean(["time", "lon"]).groupby_bins("lat", [0, 23.5, 66.5, 90])

sst_mean = sst_grp.mean()

sst_std = sst_grp.std()

sst_mean.plot.step()

(sst_mean + sst_std).plot.step(ls=":")

(sst_mean - sst_std).plot.step(ls=":")

plt.ylim(-20, 30)

plt.title("Zonal mean temperature")

在这里插入图片描述

Other axes kwargs :其他关键字

关键字 arguments xincreaseyincrease 可以控制轴的方向。

sst.isel(time=10, lon=[10, 11]).plot.line( y="lat", hue="lon", xincrease=False, yincrease=False)

在这里插入图片描述
此外,可以使用 xscale、 yscale 来设置轴伸缩性; xticks、 yticks 来设置轴刻度,xlim、 ylim 来设置轴限制。它们接受与 matplotlib 方法 Axes.set _ (x,y) scale ()、 Axes.set _ (x,y) ticks ()、 Axes.set _ (x,y) lim ()相同的值。

原文参考链接:https://xarray.pydata.org/en/stable/user-guide/plotting.html#plotting-faceting

### 回答1: 下面是基于 C 语言写的一段 vector 与 xarray 互相转换的代码,能够兼容一维、二维、三维情况: ``` #include <stdio.h> #include <stdlib.h> #define MAX_DIMS 3 typedef struct { void *data; int dims[MAX_DIMS]; int ndims; } xarray; typedef struct { void *data; int size; } vector; /* 将一维数组转换为 vector 结构 */ vector array_to_vector(void *data, int size) { vector v; v.data = malloc(size * sizeof(char)); memcpy(v.data, data, size * sizeof(char)); v.size = size; return v; } /* 将 vector 结构转换为一维数组 */ void *vector_to_array(vector v) { void *data = malloc(v.size * sizeof(char)); memcpy(data, v.data, v.size * sizeof(char)); return data; } /* 将 xarray 结构转换为 vector 结构 */ vector xarray_to_vector(xarray a) { vector v; int size = 1; for (int i = 0; i < a.ndims; i++) { size *= a.dims[i]; } v = array_to_vector(a.data, size); return v; } /* 将 vector 结构转换为 xarray 结构 */ xarray vector_to_xarray(vector v, int *dims, int ndims) { xarray a; a.data = vector_to_array(v); memcpy(a.dims, dims, ndims * sizeof(int)); a.ndims = ndims; return a; } /* 将一维数组转换为 xarray 结构 */ xarray array_to_xarray(void *data, int size) { int dims[1] = { size }; return vector_to_xarray(array_to_vector(data, size), dims, 1); } /* 将二维数组转换为 xarray 结构 */ xarray array2d_to_xarray(void *data, int nrows, int ncols) { int dims[2] = { nrows, ncols }; return vector_to_xarray(array_to_vector(data, nrows * ncols), dims, 2); } /* 将三维数组转换为 xarray 结构 */ xarray array3d_to_xarray(void *data, int dim1, int dim2, int dim3) { int dims[3] = { dim1, dim2, dim3 }; return vector_to_xarray(array_to_vector(data, dim1 * dim2 * dim3), dims, 3); } int main() { /* 示例代码 */ int a[3] = { 1, 2, 3 }; xarray arr1 = array_to_xarray(a, 3); vector vec1 = xarray_to_vector(arr1); int *b = vector_to_array(vec1); for (int i = 0; i < vec1.size / sizeof(int); i++) { printf("%d ", b[i]); } printf("\n"); int c[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } }; xarray arr2 = array2d_to_xarray(c, 2, 3); vector vec2 = xarray_to_vector(arr2); int (*d)[3] = vector_to_array(vec2); for (int i = 0 ### 回答2: 要基于C语言写一段vector与xarray(可以理解为多维数组)之间互相转换的代码,兼容一维、二维和三维数组结构。下面是一个可能的实现: ```c #include <stdio.h> #include <stdlib.h> // 定义xarray结构体 typedef struct { void* data; // 数据指针 size_t size; // 元素大小 size_t* shape; // 每个维度的大小 size_t dim; // 维度数量 } xarray; // 定义vector结构体 typedef struct { void* data; // 数据指针 size_t size; // 元素大小 size_t length; // 长度 } vector; // 从vector转换为xarray xarray vector_to_xarray(vector vec, size_t* shape, size_t dim) { xarray arr; arr.data = vec.data; arr.size = vec.size; arr.shape = shape; arr.dim = dim; return arr; } // 从xarray转换为vector vector xarray_to_vector(xarray arr) { vector vec; vec.data = arr.data; vec.size = arr.size; vec.length = 1; for (size_t i = 0; i < arr.dim; i++) { vec.length *= arr.shape[i]; } return vec; } int main() { int arr1D[] = {1, 2, 3, 4, 5}; int arr2D[][3] = {{1, 2, 3}, {4, 5, 6}}; int arr3D[][2][2] = { {{1, 2}, {3, 4}}, {{5, 6}, {7, 8}} }; // 一维数组转换为xarray size_t shape1D[] = {5}; xarray xarr1D = vector_to_xarray((vector){arr1D, sizeof(int), 5}, shape1D, 1); // xarray转换为一维数组 vector vec1D = xarray_to_vector(xarr1D); printf("1D array: "); for (size_t i = 0; i < vec1D.length; i++) { printf("%d ", ((int*)vec1D.data)[i]); } printf("\n"); // 二维数组转换为xarray size_t shape2D[] = {2, 3}; xarray xarr2D = vector_to_xarray((vector){arr2D, sizeof(int), 6}, shape2D, 2); // xarray转换为二维数组 vector vec2D = xarray_to_vector(xarr2D); printf("2D array:\n"); for (size_t i = 0; i < vec2D.length; i++) { printf("%d ", ((int*)vec2D.data)[i]); if ((i + 1) % shape2D[1] == 0) { printf("\n"); } } // 三维数组转换为xarray size_t shape3D[] = {2, 2, 2}; xarray xarr3D = vector_to_xarray((vector){arr3D, sizeof(int), 8}, shape3D, 3); // xarray转换为三维数组 vector vec3D = xarray_to_vector(xarr3D); printf("3D array:\n"); for (size_t i = 0; i < vec3D.length; i++) { printf("%d ", ((int*)vec3D.data)[i]); if ((i + 1) % (shape3D[1] * shape3D[2]) == 0) { printf("\n"); } else if ((i + 1) % shape3D[2] == 0) { printf(" "); } } return 0; } ``` 在代码中,我们定义了`xarray`结构体和`vector`结构体来分别表示多维数组和一维数组。`xarray`结构体包含了数据指针、元素大小、每个维度的大小和维度数量等信息;`vector`结构体包含了数据指针、元素大小和长度等信息。 我们实现了`vector_to_xarray`函数,该函数将一个`vector`对象转换为一个`xarray`对象。我们还实现了`xarray_to_vector`函数,该函数将一个`xarray`对象转换为一个`vector`对象。这两个函数通过将对应的属性进行赋值实现了转换。 在`main`函数中,我们定义了一维、二维和三维的数组,并进行了相应的转换测试。我们通过指定每个维度的大小和数组的元素大小来进行转换,并打印转换结果。 该代码实现了一维、二维和三维数组与`xarray`和`vector`之间的互相转换,可以根据需要进行扩展。 ### 回答3: 在基于C语言编写的代码中,可以使用以下的方法来实现Vector和Xarray之间的互相转换,同时兼容一维、二维和三维的情况。 首先,我们可以定义一个结构体来表示矢量或者数组,该结构体包含了维度信息以及指向数据的指针。比如: ``` typedef struct { int dim; // 维度 int* shape; // 每个维度的大小 double* data; // 数据的指针 } Xarray; ``` 使用上述结构体定义了Xarray类型,其中dim表示维度,shape是一个数组,存储每个维度的大小,data是一个指向双精度浮点型数据的指针。 接下来,我们可以定义一个函数用于将Vector类型转换为Xarray类型。假设Vector的定义如下: ``` typedef struct { int size; // 大小 double* data; // 数据的指针 } Vector; ``` 我们可以编写一个函数来实现Vector到Xarray的转换,代码如下: ``` Xarray vector_to_xarray(Vector v) { Xarray x; x.dim = 1; x.shape = (int*) malloc(sizeof(int)); x.shape[0] = v.size; x.data = v.data; return x; } ``` 该函数首先创建一个Xarray结构体,并将其维度值设为1,然后根据Vector的大小动态分配shape数组内存,并将Vector的大小赋值给shape[0],最后将Vector的数据指针赋值给Xarray的data指针。 类似地,我们也可以编写一个函数来实现Xarray到Vector的转换: ``` Vector xarray_to_vector(Xarray x) { Vector v; v.size = x.shape[0]; v.data = x.data; return v; } ``` 该函数根据Xarray的shape数组中的第一个元素来确定Vector的大小,并将Xarray的数据指针赋值给Vector的数据指针。 以上就是基于C语言编写的将Vector和Xarray互相转换的代码,并且可以兼容一维、二维和三维的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简朴-ocean

继续进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值