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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:21:47