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

