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

如何在Plotly Dash Python中为堆叠柱状图添加水平平均线?

在Dash堆叠柱状图中添加动态水平平均线

完整实现示例

下面是带下拉选择+动态水平平均线的堆叠柱状图代码,核心是在回调内部计算平均值并添加水平线,确保每次图表更新时线都能同步刷新:

import dash
from dash import dcc, html, Input, Output
import plotly.express as px
import pandas as pd

# 模拟建筑人口数据集
data = pd.DataFrame({
    '建筑类型': ['住宅', '商业', '工业', '住宅', '商业', '工业'],
    '年份': ['2020', '2020', '2020', '2021', '2021', '2021'],
    '人口': [1200, 800, 300, 1500, 900, 400]
})

app = dash.Dash(__name__)

app.layout = html.Div([
    # 年份下拉选择器
    dcc.Dropdown(
        id='year-select',
        options=[{'label': y, 'value': y} for y in data['年份'].unique()],
        value='2020'
    ),
    # 堆叠柱状图容器
    dcc.Graph(id='stacked-bar-chart')
])

@app.callback(
    Output('stacked-bar-chart', 'figure'),
    Input('year-select', 'value')
)
def update_chart(selected_year):
    # 筛选选中年份的数据
    filtered_data = data[data['年份'] == selected_year]
    
    # 生成堆叠柱状图
    fig = px.bar(filtered_data, x='建筑类型', y='人口', color='建筑类型', barmode='stack')
    
    # 计算当前年份的人口平均值
    avg_pop = filtered_data['人口'].mean()
    
    # 方法1:用add_hline快速添加水平线(Plotly 4.12+支持)
    fig.add_hline(
        y=avg_pop,
        line_dash="dash",
        line_color="red",
        annotation_text=f"平均值: {avg_pop:.0f}",
        annotation_position="top right"
    )

    # 方法2:用add_shape手动绘制水平线(兼容旧版本)
    # fig.add_shape(
    #     type="line",
    #     x0=0,
    #     x1=1,
    #     xref="paper",  # 基于图表宽度百分比定位x轴
    #     y0=avg_pop,
    #     y1=avg_pop,
    #     line=dict(color="red", dash="dash")
    # )
    # # 手动添加标注
    # fig.add_annotation(
    #     x=1,
    #     y=avg_pop,
    #     xref="paper",
    #     text=f"平均值: {avg_pop:.0f}",
    #     showarrow=False,
    #     xanchor="right",
    #     yanchor="bottom"
    # )
    
    return fig

if __name__ == '__main__':
    app.run_server(debug=True)

关键注意点

  1. 为什么之前add.shape无效:如果在回调外部静态添加shape,当图表因下拉选择动态更新时,新生成的figure会覆盖原有shape,必须在回调内部每次生成figure时添加水平线。
  2. add_hline的优势:这是Plotly官方推出的便捷方法,比手动用add_shape更简洁,自动处理x轴的全局定位,还能直接添加标注。
  3. 版本兼容:如果你的Plotly版本低于4.12,需要先升级:pip install --upgrade plotly。
  4. 自定义平均值逻辑:如果需要计算堆叠后的总平均值(而非单个类别平均值),可以修改avg_pop的计算,比如:avg_pop = filtered_data['人口'].sum() / len(filtered_data['建筑类型'].unique())。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:09:23