如何在HoloViews中获取小部件“处理程序”

时间:2019-11-27 09:17:49

标签: python holoviews holoviz

使用基于xArray数据的HoloViews创建图(QuadMesh)时,任何缺少的尺寸都会自动创建小部件,例如滑块,以方便数据浏览。例如:

hv_ds = hv.Dataset(data)    
plot = hv_ds.to(hv.QuadMesh, kdims=["lon", "lat"], vdims="depth")

由于数据包含价值12个月的数据,因此HoloViews将基于lon和lat创建QuadMesh,使用深度作为值,然后提供一个滑块小部件来选择月份。它将全部包装在一个如下所示的HoloMap中:

HoloMap containing 12 items of type QuadMesh
--------------------------------------------

Key Dimensions: 
     month: 1.0...12.0 
Deep Dimensions: 
     lon: -280.0...80.0 
     lat: -78.0...-44.6 
     depth: 3.5...4796.6 

Plot generated

我想获取“月份滑块”的值来更新另一个图,但是我找不到访问它的方法。没有plot.get_widget_value()或类似的东西。有什么想法可以获取指针或处理程序吗?

2 个答案:

答案 0 :(得分:1)

[多年以后...发帖以防对其他人有价值]

这是一种有效的方法,但我想还有更简单的方法......

## imports
import pandas as pd
import numpy as np
import xarray as xr

import hvplot.xarray
import panel as pn

## generate an xr.DataArray
start_date = '2021-01-01'
time = pd.date_range(start=start_date, periods=12, freq='M')
x,y = np.ogrid[0:512, 0:512]
data = np.random.randn(time.size, x.size, y.size)
coords = dict(time=time, x=x.ravel(), y=y.ravel())
space_time_xr = xr.DataArray(data, coords=coords, dims=list(coords), name='space_time')

选项 A:hvPlot --> 面板

## use hvplot to implicitly generate the widget -- there's an alternative 
space_time_hv = space_time_xr.hvplot(x='x', y='y')

## use panel to access the slider
space_time_pn = pn.panel(space_time_hv)

## a pointer to the slider widget
time_slider_pnw = space_time_pn[1][0][0]

## present the viz+widget
space_time_pn

Option A screenshot

选项 B:使用 .interactive API

需要 hvplot version >= 0.7

## use .interactive API to generate the widget
space_time_pnw = space_time_xr.interactive.sel(time=pn.widgets.DiscreteSlider).hvplot()

## a pointer to the slider widget
time_slider_pnw = space_time_pnw.widgets().objects[0]

## present the viz+widget
space_time_pnw

玩滑块... 然后可以读出滑块的当前值:

## get slider current value
current_pnw_value = time_slider_pnw.value

## print the value
print(f'{current_pnw_value}')

对于小部件状态更改时的“实时”更新,可以检查,例如 panel #Links

(选项 C).interactive + 链接示例:标题在小部件状态之后更新

## use interactive API to generate the widget
time_slider_pnw = pn.widgets.DiscreteSlider(name='time',options=space_time_xr.time.to_series().to_dict())
space_time_pn = space_time_xr.interactive.sel(time=time_slider_pnw).hvplot()

## dynamics markdown
time_md = pn.pane.Markdown(f'## {time_slider_pnw.value:%Y-%m-%d}')

def callback(target, event):
    target.object = f'## {event.new:%Y-%m-%d}'
    
## link
time_slider_pnw.link(time_md, callbacks={'value' : callback} )

## present the time slider value
pn.Column(time_md, space_time_pn.panel(), space_time_pn.widgets())

Option C .interactive + link screenshot

使用版本:

Python version       : 3.7.10

numpy : 1.20.2
xarray: 0.18.0
pandas: 1.2.4

hvplot    : 0.7.1
panel     : 0.11.3
holoviews : 1.14.3
bokeh     : 2.3.1
jupyterlab: 3.0.14

答案 1 :(得分:0)

创建这样的小部件+绘图时,我不知道如何获取当前值。也许别人认识。

但是我确实知道如何在使用以下示例的面板创建小部件+绘图时获取当前选定的值。如果这样做,可以使用What I am looking for is how a Jasavscript client with NO UI level authentication (no login screen) can access a private API securely?来获取当前选择的值:

your_selection_widget.value

您可以在此处找到有关如何创建交互式仪表板的更多信息:
https://panel.pyviz.org/gallery/apis/stocks_hvplot.html#gallery-stocks-hvplot