所以这里有一个长答案和一个简短答案。让我们从简短的回答开始,即不需要为数据变量创建自定义选择小部件,因为 hvPlot 允许自动在多个数据变量之间进行选择,所以如果您将其更改为:
rasterized_mesh = ds[time_vars].hvplot.quadmesh(
x='x', y='y', z=time_vars[::-1], crs=crs, width=600, height=400,
groupby=list(ds[var].dims[:-2]), rasterize=True, cmap='jet')

您将获得一个 DynamicMap,可让您选择非空间维度和数据变量,您现在可以将其嵌入面板中,无需额外工作。如果这就是您关心的全部内容,请停在这里,因为我们即将进入一些内部结构,希望能提供更好的理解。
让我们假设 hvPlot 不允许在数据变量之间进行选择,那么我们会怎么做?所以你必须知道的主要事情是 HoloViews 允许链接 DynamicMaps 但不允许嵌套它们。这可能有点难以理解,但我们会将问题分解为多个步骤,然后看看我们如何实现我们想要的。那么给我们提供情节的事件链是什么?
- 选择数据变量
- 在非空间维度上应用 groupby
- 对每个 QuadMesh 应用光栅化
如您所知,hvPlot 为我们处理了第 2 步和第 3 步,那么我们如何在第 2 步和第 3 步之前注入第 1 步。将来我们计划添加对将面板小部件直接传递到 hvPlot 的支持,这意味着您只需一步即可完成所有操作。由于面板仍然是一个非常新的项目,我将一路指出我们的 API 最终将如何使这个过程变得微不足道,但现在我们必须坚持使用相对冗长的解决方法。在这种情况下,我们必须重新排列操作顺序:
- 在非空间维度上应用 groupby
- 选择数据变量
- 对每个 QuadMesh 应用光栅化
因此,首先我们选择所有数据变量并跳过光栅化:
meshes = ds[time_vars].hvplot.quadmesh(
x='x', y='y', z=time_vars, crs=crs, width=600, height=400,
groupby=list(ds[var].dims[:-2]))
现在我们有了一个 DynamicMap ,其中包含我们可能想要显示的所有数据,我们可以应用下一个操作。在这里,我们将使用该hv.util.Dynamic
实用程序,该实用程序可用于在注入流值时链接 DynamicMap 上的操作。特别是在这一步中,我们从小var_select
部件创建一个流,用于重新索引QuadMesh
我们的网格内部DynamicMap
:
def select_var(obj, var):
return obj.clone(vdims=[var])
var_stream = Params(var_select, ['value'], rename={'value': 'var'})
var_mesh = hv.util.Dynamic(meshes, operation=select_var, streams=[var_select])
# Note starting in hv 1.12 you'll be able to replace this with
# var_mesh = meshes.map(select_var, streams=[var_select])
# And once param 2.0 is out we intend to support
# var_mesh = meshes.map(select_var, var=var_select.param.value)
现在我们有一个 DynamicMap 可以响应小部件的变化,但还没有光栅化它,所以我们可以rasterize
手动应用操作:
rasterized_mesh = rasterize(var_mesh).opts(cmap='jet', width=600, height=400)
现在我们有一个 DynamicMap 链接到 Selection 小部件,应用 groupby 并被光栅化,我们现在可以将其嵌入到面板中。上面@jbednar 暗示的另一种方法是通过使 hvPlot 调用不是动态的并手动进行时间和高度级别选择来一步完成所有这些工作。我不会在这里讨论它,但它也是一种有效的(如果效率较低)方法。
正如我在上面所暗示的,最终我们还打算让所有 hvPlot 参数变为动态的,这意味着您将能够执行以下操作来将小部件值链接到 hvPlot 关键字参数:
ds[time_vars].hvplot.quadmesh(
x='x', y='y', z=var_select.param.value, rasterize=True, crs=crs,
width=600, height=400, groupby=list(ds[var].dims[:-2]), cmap='jet')