如何避免Dash中堆叠柱状图按日期聚合?
问题描述
我有一个以时间序列为索引的DataFrame,使用plotly.graph_objects和Dash绘制Percent_Male与Percent_Female列的堆叠柱状图时出现异常:日期索引唯一时图表显示正常,但同一日期存在多行数据时,这些样本会被聚合为单个堆叠柱,而我需要每行数据对应独立的堆叠柱。
当前使用的轨迹代码:
trace1 = go.Bar( x = df.index, y = df.Percent_Male, name = '% Male', ) trace2 = go.Bar( x = df.index, y = df.Percent_Female, name = '% Female' )
Dash应用布局代码:
app.layout = html.Div([ html.H1('Gender Balance'), html.Div([ dcc.Graph( id='plot1', figure={ 'data': data2, 'layout':go.Layout( title='Historic', height=640, width=980, barmode='stack', ) } )],style={'display':'inline-block'} ])
解决方法
核心问题是Plotly会自动合并x轴相同值的柱子,直接用日期索引作为x轴时,同日期的行被归为一组。要实现每行对应独立堆叠柱,需给每行生成唯一的x轴标识:
- 为DataFrame添加唯一行标识
给每行生成不重复的ID,比如结合日期和行序号:
df['unique_x'] = [f"{idx}_{i}" for i, idx in enumerate(df.index)]
- 修改Bar轨迹的x轴参数
将两个轨迹的x值替换为新增的唯一标识:
trace1 = go.Bar( x=df['unique_x'], y=df.Percent_Male, name='% Male', ) trace2 = go.Bar( x=df['unique_x'], y=df.Percent_Female, name='% Female' )
- 优化x轴显示(可选)
如果希望x轴显示日期而非唯一ID,可在布局中自定义刻度:
layout = go.Layout( title='Historic', height=640, width=980, barmode='stack', xaxis=dict( tickvals=df['unique_x'], ticktext=df.index.strftime('%Y-%m-%d') # 按需求格式化日期 ) )
修改后,每行数据都会对应独立的堆叠柱,不会因日期重复被合并。
内容的提问来源于stack exchange,提问作者Jace999
相关产品推荐
相关产品推荐

