使用二维栅格阵列生成流图

Generate Streamplot With 2D Raster Arrays

我正在尝试使用来自网格化分析的 u 分量和 v 分量风在 Matplotlib 中生成流图,但我不确定如何将这些数组编译到 Streamplot 函数中。这些数据是二维的,采用 GeoTIFF 格式,并使用 xarray/rioxarray 读入 Python,如下所示:

import rioxarray as rxr
import numpy as np
ugrd = '/path/to/file/rtma2p5_ucomp.tif'
vgrd = '/path/to/file/rtma2p5_vcomp.tif'
        
ucomp = rxr.open_rasterio(ugrd)
ux, uy = np.meshgrid(ucomp['x'], ucomp['y'])
vcomp = rxr.open_rasterio(vgrd)
vx, vy = np.meshgrid(vcomp['x'], vcomp['y'])
     
X, Y = ucomp['x'], ucomp['y']
        
# Uncertainty on U,V
stream = plt.streamplot(X,Y,U,V)

根据 Streamplot 文档,我可以利用 rioxarray 将一维网格数组作为函数的 X 和 Y 参数传递。但是,我不确定如何处理 U 和 V 组件,因为在执行 numpy meshgrid 之后,两者都是二维网格划分为 x 和 y 组件。

我可以采取哪些额外步骤将每个二维风分量传递到函数中?

最简单的方法肯定是使用 xarray.Dataset.plot.streamplot:

ds = xr.Dataset({'u': ucomp, 'v': 'vcomp'})
ds.plot.streamplot(x="x", y="y", u="u", v="v")

如果你想用 matplotlib 代替,你就快到了!正如您提到的,参数确实需要是一维数组。 np.meshgrid 已经在生成 x 和 y 二维坐标标签(您已将它们分配给 ux, uy 以及 vx, vy - 我假设它们是相同的)。因此,对于每个 (x, y) 点索引 ucompvcomp,都有一组对应的坐标 (ux[i, j], uy[i, j])。这使您可以重塑所有四个数组以获得所需的输入:

plt.streamplot(
    ux.ravel(),
    uy.ravel(),
    ucomp.values.ravel(),
    vcomp.values.ravel(),
)