如何优化带updatemenus的Plotly图表,自动生成visible布尔参数列表
问题背景
使用Plotly绘制带交互按钮的图表时,手动编写updatemenus中args参数的visible布尔值列表,在trace数量较多时操作繁琐,无法适配不同规模的同结构数据。
数据结构示例
示例数据包含4个字段:name、unaregate、value、age,结构如下:
name unaregate value age input1 in11 2 0 input1 in11 0 1 input1 in11 2 2 input1 in11 3 3 input1 in11 1 4 ...
优化后实现代码
1. 测试数据生成(优化版,无需手动声明多个DataFrame)
import pandas as pd import numpy as np import plotly.graph_objects as go # 可自由扩展配置,适配不同规模的同类数据 name_config = { "input1": ["in11", "in12", "in13"], "input2": ["in21", "in22", "in23"], "input3": ["in31", "in32", "in33", "in34"] } df_list = [] age_range = range(5) for name, unaregate_list in name_config.items(): for unaregate in unaregate_list: tmp_df = pd.DataFrame({ "name": name, "unaregate": unaregate, "value": np.random.randint(0,5, size=len(age_range)), "age": age_range }) df_list.append(tmp_df) df = pd.concat(df_list, ignore_index=True)
2. 绘图+自动生成按钮可见性参数
fig = go.Figure() names = df.name.unique() # 记录每个name对应的trace数量,用于后续生成可见性列表 name_trace_counts = [] for i in names: db = df[df["name"]==i] uni = db.unaregate.unique() name_trace_counts.append(len(uni)) for f in uni: fig.add_trace(go.Scatter( x=db[db.unaregate==f].age, y=db[db.unaregate==f].value, connectgaps=False, visible=False, mode='lines', legendgroup=f, name=f )) # 自动生成按钮列表 buttons = [] # 新增默认全隐藏按钮 buttons.append(dict( label="Select name", method="update", args=[{"visible": [False]*sum(name_trace_counts)}] )) # 遍历每个name生成对应按钮的可见性参数 for idx, name in enumerate(names): visible_list = [] for count_idx, count in enumerate(name_trace_counts): visible_list.extend([True]*count if count_idx == idx else [False]*count) buttons.append(dict( label=name, method="update", args=[{"visible": visible_list}] )) # 配置布局 fig.update_layout( template="simple_white", xaxis=dict(title_text="age"), yaxis=dict(title_text="Value"), width=1000, height = 600, updatemenus=[ dict( active=0, buttons=buttons ) ] ) fig.show()
适配说明
代码会自动统计每个name分组下的trace数量,动态生成对应的visible布尔列表,无需手动修改任何布尔值,可直接适配任意长度的同结构数据。
内容的提问来源于stack exchange,提问作者Pandas INC
相关产品推荐
相关产品推荐

