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

如何用Plotly下拉菜单切换展示不同DataFrame图表

解决Plotly下拉菜单切换DataFrame的可见性问题

需求:制作Plotly图表,通过下拉菜单切换/筛选不同前缀(L001、L002、L003)的数据列。

数据表格

TimeStampL001_1L001_2L001_3L002_1L002_2L003_1L003_2
1.1.20231223442
2.1.20232454643

原代码问题

原代码中visible参数的列表长度与实际添加的trace数量不匹配:

  • 实际添加了7个trace(L001的3列 + L002的2列 + L003的2列)
  • 但visible只设置了3个元素,导致下拉菜单切换时无法正确控制对应trace的显示/隐藏。

修正后的代码

import plotly.graph_objects as go
import pandas as pd

# 构造数据
data = {
    'TimeStamp': ['1.1.2023', '2.1.2023'],
    'L001_1': [1, 2],
    'L001_2': [2, 4],
    'L001_3': [2, 5],
    'L002_1': [3, 4],
    'L002_2': [4, 6],
    'L003_1': [4, 4],
    'L003_2': [2, 3]
}
df = pd.DataFrame(data)
df.set_index('TimeStamp', inplace=True)

fig = go.Figure()

# 按分组添加trace,并记录每个分组的trace数量
group_trace_counts = {
    'L001': len(df.filter(regex='L001').columns),
    'L002': len(df.filter(regex='L002').columns),
    'L003': len(df.filter(regex='L003').columns)
}

# 添加所有trace
for col in df.columns:
    fig.add_trace(go.Scatter(y=df[col], x=df.index, name=col))

# 计算总trace数
total_traces = len(fig.data)

# 构建每个按钮对应的visible列表
all_visible = [True] * total_traces
l001_visible = [True]*group_trace_counts['L001'] + [False]*(total_traces - group_trace_counts['L001'])
l002_visible = [False]*group_trace_counts['L001'] + [True]*group_trace_counts['L002'] + [False]*group_trace_counts['L003']
l003_visible = [False]*(group_trace_counts['L001']+group_trace_counts['L002']) + [True]*group_trace_counts['L003']

fig.update_layout(
    title_text='Load',
    xaxis_title='Date',
    yaxis_title='Load',
    updatemenus=[
        dict(
            active=0,
            buttons=[
                dict(
                    label="ALL",
                    method="update",
                    args=[
                        {"visible": all_visible},
                        {"title": "ALL Load Data"}
                    ]
                ),
                dict(
                    label="L001",
                    method="update",
                    args=[
                        {"visible": l001_visible},
                        {"title": "L001 Load Data"}
                    ]
                ),
                dict(
                    label="L002",
                    method="update",
                    args=[
                        {"visible": l002_visible},
                        {"title": "L002 Load Data"}
                    ]
                ),
                dict(
                    label="L003",
                    method="update",
                    args=[
                        {"visible": l003_visible},
                        {"title": "L003 Load Data"}
                    ]
                )
            ]
        )
    ]
)

fig.show()

关键修正点

  1. 确保visible列表长度与图表中trace的总数量一致(此处为7个元素)
  2. 针对每个分组,精确控制对应位置的trace可见性:
    • L001:前3个trace设为True,其余为False
    • L002:中间2个trace设为True,其余为False
    • L003:最后2个trace设为True,其余为False
  3. 简化数据处理逻辑,无需拆分多个DataFrame,直接在原DataFrame上按前缀筛选列添加trace

内容的提问来源于stack exchange,提问作者Patrik.so

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:15:32