如何使用holoview QuadMesh 绘制不规则网格RGB?

问题描述 投票:0回答:1

我正在处理不规则网格的地球观测数据,并试图找到使用以散景为后端的全息视图来有效绘制数据的方法。 如果可能的话,我希望避免插值

通过 RGB 方法Holoviews RGB 坐标绘制规则网格数据似乎很简单。然而,对于不规则网格数据的方法似乎是使用 Quadmesh。对于映射到定义的颜色图的单通道数据来说,实现这一点并使用数据着色来节省内存非常简单,例如;

qmesh = hv.QuadMesh((lon, lat, band_dict['Oa08_radiance']))
datashade(qmesh, cmap=plt.cm.viridis).opts(width=np.shape(lon)[0], height=np.shape(lon)[1])

到目前为止,一切都很好,但尽管我尽了最大努力,我还是找不到一种方法来实现 3 通道 RGB。在我之前的 matplotlib 尝试实现同样的事情中,我将一个元组传递给 pcolormesh“color”参数,或者将一个 LinearSegmentedColormap 传递给“cmap”参数。在这种情况下都不起作用。

令人惊讶的是,我找不到任何预先存在的例子;这让我想知道我正在尝试的事情是否是不可能的。有其他人尝试过同样的事情并且可以提供帮助吗?

python bokeh holoviews datashader
1个回答
0
投票

不能保证这是最好的方法,但我使用自定义的元素变换子类化

holoviews.operation.Operation
完成了工作。这是我的解决方案的应用程序,重新创建了 RGB 示例。

import xarray as xr
import numpy as np
import holoviews as hv

hv.extension("bokeh")

x, y = np.mgrid[-50:51, -50:51] * 0.1

r = 0.5*np.sin(np.pi + 3 * x ** 2 + y ** 2) + 0.5
g = 0.5*np.sin(x ** 2 + 2 * y ** 2) + 0.5
b = 0.5*np.sin(np.pi / 2 + x ** 2 + y ** 2) + 0.5

hv.RGB(np.stack([r,g,b], axis=-1))

假设

x
y
实际上是不规则网格,而不是 hv.RGB。在这种情况下,标记您的数据并创建三个光栅化图像。

from holoviews.operation.datashader import rasterize

dataset = xr.Dataset(
    data_vars={
        "R": (("x", "y"), r),
        "G": (("x", "y"), g),
        "B": (("x", "y"), b),
    },
    coords={
        "X": (("x", "y"), x),
        "Y": (("x", "y"), y),
    },
)
red, green, blue = [rasterize(hv.QuadMesh(dataset[i])) for i in ("R", "G", "B")]

每个颜色通道现在都是一个返回图像的 DynamicMap。内置的

holoviews.operation.factory
确实应该完成下一项工作,即将将重叠图像组合成 RGB 的简单操作映射到每个 DynamicMap 上……但我无法让它工作。因此,需要进行自定义操作。

from holoviews.operation import Operation

class rgb(Operation):
    def _process(self, overlay, key=None):
        dataset = xr.merge((image.data for image in overlay.values()))
        array = dataset.to_array("band").transpose(..., "band")
        return hv.RGB(array)

rgb(red * green * blue)

生成的 DynamicMap 看起来与通常的

rasterize
输出类似,但在重叠通道上。

© www.soinside.com 2019 - 2024. All rights reserved.