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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:05:13