如何用Plotly下拉菜单切换展示不同DataFrame图表
解决Plotly下拉菜单切换DataFrame的可见性问题
需求:制作Plotly图表,通过下拉菜单切换/筛选不同前缀(L001、L002、L003)的数据列。
数据表格
| TimeStamp | L001_1 | L001_2 | L001_3 | L002_1 | L002_2 | L003_1 | L003_2 |
|---|---|---|---|---|---|---|---|
| 1.1.2023 | 1 | 2 | 2 | 3 | 4 | 4 | 2 |
| 2.1.2023 | 2 | 4 | 5 | 4 | 6 | 4 | 3 |
原代码问题
原代码中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()
关键修正点
- 确保
visible列表长度与图表中trace的总数量一致(此处为7个元素) - 针对每个分组,精确控制对应位置的trace可见性:
- L001:前3个trace设为True,其余为False
- L002:中间2个trace设为True,其余为False
- L003:最后2个trace设为True,其余为False
- 简化数据处理逻辑,无需拆分多个DataFrame,直接在原DataFrame上按前缀筛选列添加trace
内容的提问来源于stack exchange,提问作者Patrik.so
相关产品推荐
相关产品推荐

