Panel中如何将Tabulator选中行的值动态传递至绘图函数?
解决方案:用Panel响应式变量实现Tabulator选中行与图表的联动
核心思路
用Panel的响应式变量存储选中行的TIC_ID和modes,再让绘图函数监听这些变量的变化,实现动态更新图表。
修改后的完整代码
import pandas as pd import panel as pn import hvplot.pandas # 需导入hvplot才能生成图表 pn.extension('tabulator') # 模拟示例数据(替换为你的实际df_parameters_short) df_parameters_short = pd.DataFrame({ 'TIC_ID': ['TIC_123', 'TIC_456', 'TIC_789'], 'modes': ['mode_a', 'mode_b', 'mode_c'], 'other_cols': ['foo', 'bar', 'baz'] }) # 1. 创建响应式变量,存储选中参数(设为不可见,仅用于传递数据) selected_tic_id = pn.widgets.TextInput(value=df_parameters_short.iloc[0]['TIC_ID'], visible=False) selected_mode = pn.widgets.TextInput(value=df_parameters_short.iloc[0]['modes'], visible=False) def click(event): # 2. 点击行时更新响应式变量的值 selected_tic_id.value = df_parameters_short.iloc[event.row]['TIC_ID'] selected_mode.value = df_parameters_short.iloc[event.row]['modes'] def show_dataframe(base_dataframe): selectable_table = pn.widgets.Tabulator( base_dataframe, disabled=True, selection=[0], selectable=1, pagination='remote', page_size=20, show_index=False ) selectable_table.on_click(click) return selectable_table # 3. 用@pn.depends让绘图函数监听响应式变量的变化 @pn.depends(selected_tic_id.param.value, selected_mode.param.value) def plotter(tic_id, mode): # 替换为你的实际数据路径 path = './data/' try: df = pd.read_csv(f"{path}{tic_id}/{mode}/results.csv") fig = df.hvplot.scatter(x='phase', y='flux', title=f"{tic_id} - {mode}") return fig except FileNotFoundError: return pn.pane.Markdown(f"⚠️ 未找到文件:{path}{tic_id}/{mode}/results.csv") # 4. 组装仪表盘组件 table = show_dataframe(df_parameters_short) plot_panel = pn.panel(plotter) # 并排展示表格与图表 dashboard = pn.Row(table, plot_panel) dashboard.servable()
关键说明
- 响应式变量:
selected_tic_id和selected_mode作为数据传递的“桥梁”,它们的value属性是响应式的——值一旦更新,所有依赖它们的函数会自动重新执行。 - @pn.depends装饰器:明确告知Panel,
plotter函数的输入依赖于这两个变量,变量变化时自动触发函数重新生成图表。 - 异常处理:加入文件不存在的提示,避免程序崩溃,提升交互友好性。
之前尝试失败的原因
你之前的click函数仅将选中值存在局部变量中,这些变量无法被plotter感知。用Panel响应式变量相当于把值放在全局可监听的容器里,让两个函数能通过这个容器实现数据联动。
内容的提问来源于stack exchange,提问作者szilac
相关产品推荐
相关产品推荐

