如何在Plotly中为堆叠柱状图添加趋势线?代码改造需求
修改方案:折线图转堆叠柱状图+顶部趋势线
核心思路
- 将原折线图的分类数据替换为堆叠柱状图(通过
stackgroup或barmode='stack'实现) - 添加趋势线(可选择实际总和折线或拟合趋势线)
- 调整布局确保趋势线在柱状图上方显示
示例修改代码
假设你的原始代码基于类似如下的数据集,以下是完整修改后的可运行代码:
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
相关产品推荐
相关产品推荐

