Holoviews DynamicMap:实现单选按钮切换与点击联动表格功能
需求说明
基于现有代码实现以下功能:
- 点击图表中的任意点,右侧表格显示对应DataFrame的该行数据
- 核心要求:
- 每次点击都实时更新表格内容
- 切换RadioButton时,图表的缩放、平移状态不重置
完整实现代码
import pandas as pd import panel as pn import holoviews as hv hv.extension('bokeh') # 初始化两个测试DataFrame df_a = pd.DataFrame(index=['a','b', 'c', 'd'], data={'x':range(4), 'y':range(4)}) df_b = pd.DataFrame(index=['w','x', 'y', 'z'], data={'x':range(4), 'y':range(3,-1,-1)}) # 创建RadioButton组件 radio_button = pn.widgets.RadioButtonGroup(options=['df_a', 'df_b'], value='df_a') # 创建用于显示选中行的表格组件 selected_row_table = pn.widgets.DataFrame(height=100, width=200) # 创建基础Points绘图对象,初始加载df_a数据 points = hv.Points(df_a, kdims=['x', 'y']).opts(size=10, tools=['tap']) # 监听RadioButton切换事件,更新Points的数据源(不重建绘图对象) def update_points_data(event): target_df = df_a if event.new == 'df_a' else df_b points.data = target_df radio_button.param.watch(update_points_data, 'value') # 创建选择流,监听Points的点击选择事件 selection_stream = hv.streams.Selection1D(source=points) # 根据选中点的索引更新表格内容 def update_selected_table(index): if not index: selected_row_table.value = pd.DataFrame() return current_df = df_a if radio_button.value == 'df_a' else df_b # 将选中行转为表格格式 selected_row = current_df.iloc[index[0]].to_frame().T selected_row_table.value = selected_row selection_stream.param.watch(update_selected_table, 'index') # 组装布局并启动服务 pn.Row(pn.Column(radio_button, points), selected_row_table).servable()
关键实现细节
- 保留缩放状态:通过直接更新
points.data来切换数据源,而非每次返回新的Points对象。这样Bokeh的绘图实例会被保留,之前的缩放、平移视图状态不会被重置。 - 点击实时更新表格:利用
hv.streams.Selection1D捕获点击选中的点索引,结合当前选中的DataFrame,提取对应行数据并更新表格组件。 - 空状态处理:当没有选中点时,表格显示空内容。
内容的提问来源于stack exchange,提问作者hm8
相关产品推荐
相关产品推荐

