Python 如何在HoloViews/Bokeh中创建具有小部件(选择器)和绘图间交互(点击流)的仪表板?

Python 如何在HoloViews/Bokeh中创建具有小部件(选择器)和绘图间交互(点击流)的仪表板?,python,bokeh,dashboard,interactive,holoviews,Python,Bokeh,Dashboard,Interactive,Holoviews,我正在尝试创建一个仪表板,它由两个图(热图和折线图)和一个小部件(选择器)组成: 当您从窗口小部件中选择一个选项时,两个绘图都会更新 点击第一个绘图时,第二个绘图将根据点击信息进行更新 目前,我正在尝试在HoloView中进行此操作。看起来这应该很容易做到,但不知怎么的,我还是无法控制自己 下面的代码显示了它的外观。但是,选择器没有以任何方式连接到仪表板,因为我不知道如何连接 import pandas as pd import numpy as np import panel as p

我正在尝试创建一个仪表板,它由两个图(热图和折线图)和一个小部件(选择器)组成:

  • 当您从窗口小部件中选择一个选项时,两个绘图都会更新
  • 点击第一个绘图时,第二个绘图将根据点击信息进行更新

目前,我正在尝试在HoloView中进行此操作。看起来这应该很容易做到,但不知怎么的,我还是无法控制自己

下面的代码显示了它的外观。但是,选择器没有以任何方式连接到仪表板,因为我不知道如何连接

import pandas as pd
import numpy as np

import panel as pn
import holoviews as hv


hv.extension('bokeh')


def create_test_df(k_features, n_tickers=5, m_windows=5):
    start_date = pd.Timestamp('01-01-2020')
    window_len = pd.Timedelta(days=1)
    cols = ['window_dt', 'ticker'] + [f'feature_{i}' for i in range(k_features)]
    data = {c: [] for c in cols}
    
    for w in range(m_windows):
        window_dt = start_date + w*window_len
        for t in range(n_tickers):
            ticker = f'ticker_{t}'
            data['window_dt'].append(window_dt)
            data['ticker'].append(ticker)
            for f in range(k_features):
                data[f'feature_{f}'].append(np.random.rand())
    return pd.DataFrame(data)

k_features = 3
features = [f'feature_{i}' for i in range(k_features)]
df = create_test_df(k_features)

selector = pn.widgets.Select(options=features)
heatmap = hv.HeatMap(df[['window_dt', 'ticker', f'{selector.value}']])
posxy = hv.streams.Tap(source=heatmap, x='01-01-2020', y='ticker_4')

def tap_heatmap(x, y):
    scalar = np.random.randn()
    x = np.linspace(-2*np.pi, 2*np.pi, 100)
    data = list(zip(x, np.sin(x*scalar)))
    return hv.Curve(data)

pn.Row(heatmap, hv.DynamicMap(tap_heatmap, streams=[posxy]), selector)

好的,我终于明白了。结果证明它很简单(正如预期的那样),但不太直观。基本上,应该使用不同的方法来实现选择器(下拉菜单)。该示例的工作代码如下所示:

import pandas as pd
import numpy as np

import panel as pn
import holoviews as hv


hv.extension('bokeh')


def create_test_df(k_features, n_tickers=5, m_windows=5):
    start_date = pd.Timestamp('01-01-2020')
    window_len = pd.Timedelta(days=1)
    cols = ['window_dt', 'ticker'] + [f'feature_{i}' for i in range(k_features)]
    data = {c: [] for c in cols}
    
    for w in range(m_windows):
        window_dt = start_date + w*window_len
        for t in range(n_tickers):
            ticker = f'ticker_{t}'
            data['window_dt'].append(window_dt)
            data['ticker'].append(ticker)
            for f in range(k_features):
                data[f'feature_{f}'].append(np.random.rand())
    return pd.DataFrame(data)


def load_heatmap(feature):
    return hv.HeatMap(df[['window_dt', 'ticker', f'{feature}']])


def tap_heatmap(x, y):
    scalar = np.random.randn()
    x = np.linspace(-2*np.pi, 2*np.pi, 100)
    data = list(zip(x, np.sin(x*scalar)))
    return hv.Curve(data)


k_features = 3
features = [f'feature_{i}' for i in range(k_features)]
df = create_test_df(k_features)

heatmap_dmap = hv.DynamicMap(load_heatmap, kdims='Feature').redim.values(Feature=features)
posxy = hv.streams.Tap(source=heatmap_dmap, x='01-01-2020', y='ticker_0')
sidegraph_dmap = hv.DynamicMap(tap_heatmap, streams=[posxy])

pn.Row(heatmap_dmap, sidegraph_dmap)

我不是HollowViews/Bokeh方面的专家,但我要说的是,这是一个非常好用的库,有很多定制选项。以下是有关如何创建和的文档链接。此外,所有这些图形都支持交互功能,如悬停和缩放。感谢您指出这一点。然而,这对我来说似乎并不容易,因为我自己也是一个初学者。你能提供一些关于如何实施我描述的任务的更多细节吗?