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

如何在Plotly中为堆叠柱状图添加趋势线?代码改造需求

修改方案:折线图转堆叠柱状图+顶部趋势线

核心思路

  1. 将原折线图的分类数据替换为堆叠柱状图(通过stackgroup或barmode='stack'实现)
  2. 添加趋势线(可选择实际总和折线或拟合趋势线)
  3. 调整布局确保趋势线在柱状图上方显示

示例修改代码

假设你的原始代码基于类似如下的数据集,以下是完整修改后的可运行代码:

import plotly.graph_objects as go
import pandas as pd
import numpy as np

# 模拟业务数据(可替换为你的真实数据)
df = pd.DataFrame({
    '年份': ['2018', '2019', '2020', '2021', '2022'],
    '产品A': [100, 120, 150, 180, 220],
    '产品B': [80, 90, 110, 130, 160],
})

# 计算总销量(用于趋势线数据)
df['总销量'] = df['产品A'] + df['产品B']

# 初始化图表对象
fig = go.Figure()

# 添加堆叠柱状图的第一个分类
fig.add_trace(go.Bar(
    x=df['年份'],
    y=df['产品A'],
    name='产品A',
    stackgroup='sales'  # 相同stackgroup的柱状图会自动堆叠
))

# 添加堆叠柱状图的第二个分类
fig.add_trace(go.Bar(
    x=df['年份'],
    y=df['产品B'],
    name='产品B',
    stackgroup='sales'
))

# 添加顶部趋势线(这里用实际总销量的折线,直观展示总和)
fig.add_trace(go.Scatter(
    x=df['年份'],
    y=df['总销量'],
    mode='lines+markers',
    name='总销量趋势',
    line=dict(color='#ff4d4f', width=2, dash='dash')  # 设置显眼的样式
))

# 可选:如果需要线性拟合趋势线(替代实际总销量)
# x_vals = np.arange(len(df['年份']))
# slope, intercept = np.polyfit(x_vals, df['总销量'], 1)
# fig.add_trace(go.Scatter(
#     x=df['年份'],
#     y=slope * x_vals + intercept,
#     mode='lines',
#     name='拟合趋势线',
#     line=dict(color='#fa8c16', width=2, dash='dot')
# ))

# 调整布局参数
fig.update_layout(
    title='销量堆叠柱状图',
    xaxis_title='年份',
    yaxis_title='销量',
    # 也可以用barmode='stack'替代stackgroup参数,二选一即可
    # barmode='stack',
    yaxis=dict(range=[0, df['总销量'].max() * 1.1])  # 扩大y轴范围,避免趋势线被截断
)

fig.show()

常见问题排查(针对你之前add_trace(go.Bar())失败的情况)

  • 未设置堆叠模式:必须给所有Bar trace设置相同的stackgroup,或者在update_layout中指定barmode='stack',否则柱状图会并列显示而非堆叠
  • 趋势线被遮挡:通过yaxis.range手动扩大y轴范围,确保趋势线的最高点完全显示
  • 数据不匹配:确保柱状图和趋势线的x轴数据类型、长度完全一致(比如都是字符串年份,或都是数值型时间)

内容的提问来源于stack exchange,提问作者HoangIta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:50:10