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

如何避免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轴标识:

  1. 为DataFrame添加唯一行标识
    给每行生成不重复的ID,比如结合日期和行序号:
df['unique_x'] = [f"{idx}_{i}" for i, idx in enumerate(df.index)]
  1. 修改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'
)
  1. 优化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:01:27