使用基于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.get_widget_value()
或类似的东西。有什么想法可以获取指针或处理程序吗?
答案 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')
## 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
需要 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
## 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())
使用版本:
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