Python Plotly子图通过下拉菜单同步更新数据的实现方法
Plotly 共享X轴双子图下拉同步更新实现方案
核心逻辑
单图场景下restyle仅需更新单个轨迹数据,双子图场景只需在构造下拉按钮时,一次性指定两个轨迹对应的数据更新规则,即可实现选择分组时两个子图同步切换:
- 初始化子图时,两次
add_trace生成的轨迹索引分别为0(上方子图,绑定df1)、1(下方子图,绑定df2) - 每个下拉按钮的
restyle参数中,按轨迹索引顺序传入对应分组的x、y数据,同时指定要更新的轨迹索引列表,即可一次操作完成两个子图的数据刷新
关键代码实现
以下为完整可运行代码,已标注缺失的下拉菜单逻辑部分,可直接替换为自定义的df1、df2数据集:
import plotly.graph_objects as go from plotly.subplots import make_subplots import pandas as pd # ---------- 数据准备(和单图逻辑一致)---------- # 替换为自定义df1、df2,需保证两个数据集分组字段t的枚举值完全一致 df1 = pd.DataFrame({ 't': ['A','A','B','B','C','C'], 'x': [1,2,1,2,1,2], 'y1': [10,15,20,25,30,35] }) df2 = pd.DataFrame({ 't': ['A','A','B','B','C','C'], 'x': [1,2,1,2,1,2], 'y2': [100,150,200,250,300,350] }) group_list = sorted(df1['t'].unique()) default_group = group_list[0] # ---------- 子图初始化(已完成的部分)---------- fig = make_subplots( rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.12 ) # 添加上方子图初始轨迹(索引0) fig.add_trace( go.Scatter( x=df1[df1['t']==default_group]['x'], y=df1[df1['t']==default_group]['y1'], mode='lines+markers', name='数据集1' ), row=1, col=1 ) # 添加下方子图初始轨迹(索引1) fig.add_trace( go.Scatter( x=df2[df2['t']==default_group]['x'], y=df2[df2['t']==default_group]['y2'], mode='lines+markers', name='数据集2' ), row=2, col=1 ) # ---------- 下拉菜单控制逻辑(需要补充的部分)---------- menu_buttons = [] for group in group_list: # 提取当前分组下两个数据集的对应数据 g_data1 = df1[df1['t']==group] g_data2 = df2[df2['t']==group] menu_buttons.append( dict( label=f'分组{group}', method='restyle', args=[ # 按轨迹顺序传入更新值:[轨迹0的x, 轨迹1的x]、[轨迹0的y, 轨迹1的y] {'x': [g_data1['x'], g_data2['x']], 'y': [g_data1['y1'], g_data2['y2']]}, # 指定要更新的轨迹索引,对应add_trace的顺序 [0, 1] ] ) ) # 绑定下拉菜单到布局 fig.update_layout( updatemenus=[ dict( buttons=menu_buttons, showactive=True, x=0.08, xanchor='left', y=1.12, yanchor='top' ) ], height=600, title='双子图分组数据同步切换' ) fig.show()
注意事项
- 提前对齐df1、df2的分组枚举值,避免出现某分组在一个数据集存在、另一个不存在的匹配错误
args内x、y的数组顺序必须和trace_indices的轨迹顺序严格对应,顺序颠倒会导致两个子图数据错配- 若后续给子图新增轨迹(如参考线、误差棒),只需对应扩展
trace_indices列表和属性数组的元素即可 - 开启
shared_xaxes=True后,切换分组时X轴范围会自动适配两个子图的x值区间,无需额外编写轴范围更新逻辑
内容的提问来源于stack exchange,提问作者soungalo
相关产品推荐
相关产品推荐

