如何用Plotly绘制带多类别切换按钮的对比柱状图?
问题与修正方案
需求说明
给定包含季度销售、净利润数据的DataFrame,需实现Plotly对比柱状图:
- X轴为q1/q2等季度维度,每个股票对应一组柱状条
- 添加切换按钮(选项:Sales、Net Profit),选择后展示对应指标下最多6支股票的季度数据对比
原代码问题分析
原代码无法实现预期效果,核心问题包括:
- 硬编码固定股票数据(仅取Stock1和Stock2的Sales),无法适配多股票与指标切换
- 按钮参数设置错误,未正确关联对应指标的全量股票数据
- 缺少分组柱状图配置与图例,无法区分不同股票
修正后的代码
import pandas as pd import numpy as np import plotly.graph_objects as go my_dict = dict({ 'quarterly_result' : ['Sales','Net Profit', 'Sales', 'Net Profit'], 'stockname' : ['Stock1', 'Stock1','Stock2', 'Stock2'], 'q1' : [100,10,np.nan,np.nan], 'q2' : [110,20.6,570,120], 'q3' : [67,-2.0,620,125.7], 'q4' : [125,40.5,np.nan,np.nan], 'q5' : [np.nan,np.nan,660,105.9], 'q6' : [np.nan,np.nan,636,140] }) df = pd.DataFrame(my_dict) # 按指标分组,便于快速提取对应数据 grouped_data = df.groupby('quarterly_result') quarter_cols = df.columns[2:] # 获取所有季度列 metrics_list = ['Sales', 'Net Profit'] fig = go.Figure() # 初始化图表,默认展示Sales指标的所有股票数据 for _, stock_row in grouped_data.get_group('Sales').iterrows(): fig.add_trace(go.Bar( x=quarter_cols, y=stock_row[2:], name=stock_row['stockname'] )) # 构建切换按钮 toggle_buttons = [] for metric in metrics_list: metric_data = grouped_data.get_group(metric) # 提取当前指标下所有股票的季度数值和名称 stock_y_values = [row[2:] for _, row in metric_data.iterrows()] stock_names = [row['stockname'] for _, row in metric_data.iterrows()] toggle_buttons.append({ 'method': 'update', 'label': metric, 'args': [ {'y': stock_y_values, 'name': stock_names}, # 更新所有柱状条的数值和图例 {'title': f'{metric} - Quarterly Comparison by Stock'} # 更新图表标题 ] }) # 配置按钮布局 updatemenus_config = [{ 'buttons': toggle_buttons, 'direction': 'down', 'showactive': True, 'x': 0.1, 'y': 1.15 # 按钮置于图表顶部 }] # 优化整体布局 fig.update_layout( updatemenus=updatemenus_config, title='Sales - Quarterly Comparison by Stock', xaxis_title='Quarter', yaxis_title='Value', barmode='group' # 同季度柱状条分组显示,避免重叠 ) fig.show()
修正要点
- 用
groupby按指标分组,动态提取任意指标下的全量股票数据,支持最多6支股票 - 初始化时默认加载Sales数据,每个股票对应独立trace并添加图例名称
- 按钮参数正确关联指标数据,切换时同步更新所有柱状条的数值、图例及标题
- 设置
barmode='group'实现分组对比,优化轴标题与按钮位置提升可读性
内容的提问来源于stack exchange,提问作者RSW
相关产品推荐
相关产品推荐

