将面板的DatetimeRangePicker绑定到图表

0 投票
0 回答
11 浏览
提问于 2025-04-12 08:42

我正在尝试修改一个已经能用的面板仪表盘,把原来的 DatetimeRangeSlider 小部件换成 DatetimeRangePicker 小部件。

我有一段很长的时间序列,但通常只想绘制最近两周的数据。

问题是,在 holoviz 的教程中,使用的方式是把 date_slider.param.value_start 和 date_slider.param.value_end 这两个值绑定到绘图的数据选择上。而在 date_picker 对象中没有类似的参数。虽然使用 date_picker.value[0] 和 date_picker.value[1] 可以用来进行初始绘图,但选择新的值后,绘图并不会更新。那怎样才能正确地把日期选择器小部件绑定到绘图上,以便更新呢?

下面是代码的工作版本和显示问题的结果图片。

import numpy as np
import pandas as pd
import panel as pn
import hvplot.pandas

# create data
df = pd.DataFrame(
    {"data": np.random.randint(0, 100, 100), "data2": np.random.randint(0, 100, 100)},
    index=pd.date_range(start="2022", freq="D", periods=100),
)

# slider widget - updating
date_slider = pn.widgets.DatetimeRangeSlider(
    name="Date Range ",
    start=df.index.min(),
    end=df.index.max(),
    value=(df.index.max() - pd.Timedelta(14, "day"), df.index.max()),
)

# date picker widget - not updating
date_picker = pn.widgets.DatetimeRangePicker(
    name="Date Range",
    start=df.index.min(),
    value=(df.index.max() - pd.Timedelta(14, "day"), df.index.max()),
)

#plotting function
def ts_plot(df, start_val, end_val):

    df = df[(df.index > start_val) & (df.index <= end_val)]

    hv_plot = df.hvplot(
        x="index",
        y=["data", "data2"],
    )
    return hv_plot


# slider binding
slider_plot = pn.bind(
    ts_plot, df, date_slider.param.value_start, date_slider.param.value_end
)

#picker binding
picker_plot = pn.bind(ts_plot, df, date_picker.value[0], date_picker.value[1])

# panel layout
slider = pn.Column(date_slider, slider_plot)
picker = pn.Column(date_picker, picker_plot)

pn.Row(slider, picker).servable()

screenshot

0 个回答

暂无回答

撰写回答