You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Holoviews DynamicMap:实现单选按钮切换与点击联动表格功能

RadioButton切换DataFrame并实现点击点显示详情表格(保留缩放状态)

需求说明

基于现有代码实现以下功能:

  • 点击图表中的任意点,右侧表格显示对应DataFrame的该行数据
  • 核心要求:
    1. 每次点击都实时更新表格内容
    2. 切换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:57:26