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

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

以下是特定变量(同时具有时间和高度维度)的示例网格:
python - 变量改变时的面板/Hvplot交互-LMLPHP

当我从面板小部件中选择一个变量时,我希望更新 map :
python - 变量改变时的面板/Hvplot交互-LMLPHP
我尝试将其作为动态 map 来执行,如下所示:
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])

但是当我尝试显示 map 时,我得到:
Exception: Nesting a DynamicMap inside a DynamicMap is not supported.

从面板小部件中为 hvplot 选择变量似乎是一种常见的需求。使用 pyviz 完成此任务的最佳方法是什么?

如果它有用,这是我的 full attempt Jupyter Notebook

最佳答案

因为 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)

生产:
python - 变量改变时的面板/Hvplot交互-LMLPHP

这是 full notebook

关于python - 变量改变时的面板/Hvplot交互,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54769115/

10-13 02:53
查看更多