变量变化时面板/Hvplot 交互

Ric*_*ell 6 python holoviews pyviz

我正在尝试创建一个包含两个 Holoviews 对象的仪表板:一个包含 xarray 变量列表的面板对象,以及一个在输入上采用所选变量的 hvplot对象,如下所示:pn.widgets.Select

def hvmesh(var=None):
    mesh = ds[var].hvplot.quadmesh(x='x', y='y', rasterize=True, crs=crs, 
       width=600, height=400, groupby=list(ds[var].dims[:-2]), cmap='jet')
    return mesh
Run Code Online (Sandbox Code Playgroud)

以下是特定变量(同时具有时间和高度维度)的示例网格: 在此输入图像描述

当我从面板小部件中选择变量时,我希望更新地图: 在此输入图像描述 我尝试将其作为动态地图来执行,如下所示:

from holoviews.streams import Params
import holoviews as hv

var_stream = Params(var_select, ['value'], rename={'value': 'var'})

mesh = hv.DynamicMap(hvmesh, streams=[var_stream])
Run Code Online (Sandbox Code Playgroud)

但是当我尝试显示地图时,我得到:

Exception: Nesting a DynamicMap inside a DynamicMap is not supported.
Run Code Online (Sandbox Code Playgroud)

从面板小部件中选择 hvplot 变量似乎是一种常见的需要。使用pyviz实现此目的的最佳方法是什么?

如果它有用,这是我的完整尝试 Jupyter Notebook

Ric*_*ell 4

由于groupby所选的每个变量都会发生变化,因此无法将变量列表传递给hvplot. 因此,一种解决方案是每次选择新变量时重新创建绘图。这有效:

import holoviews as hv
from holoviews.streams import Params

def plot(var=None, tiles=None):
    var = var or var_select.value
    tiles = tiles or map_select.value
    mesh = ds[var].hvplot.quadmesh(x='x', y='y', rasterize=True, crs=crs, title=var,
                                   width=600, height=400, groupby=list(ds[var].dims[:-2]), 
                                   cmap='jet')
    return mesh.opts(alpha=0.7) * tiles

def on_var_select(event):
    var = event.obj.value
    col[-1] = plot(var=var)

def on_map_select(event):
    tiles = event.obj.value
    col[-1] = plot(tiles=tiles)

var_select.param.watch(on_var_select, parameter_names=['value']);
map_select.param.watch(on_map_select, parameter_names=['value']);

col = pn.Column(var_select, map_select, plot(var_select.value) * tiles)
Run Code Online (Sandbox Code Playgroud)

生产: 在此输入图像描述

这是完整的笔记本