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

Plotly Express实现指定列的分组堆叠柱状图求助

解决Plotly实现指定列分组堆叠柱状图的问题

原代码问题分析

你的代码存在两个关键问题:

  • y参数错误包含了Year列(这是x轴的分组依据,不应作为y轴数值列)
  • 仅用barmode="group"会将所有y列视为独立分组,无法实现「部分列堆叠、组间分组」的混合效果

解决方案1:Plotly Express(简洁高效)

通过数据重塑+stackgroup参数实现需求,步骤如下:

  1. 将宽表转为长表,并为每个类别标记所属堆叠组
  2. 利用stackgroup指定堆叠规则,barmode="group"实现组间并排
import plotly.express as px
import pandas as pd

# 转换数据格式:宽表转长表
df_melt = df2.melt(id_vars="Year", var_name="Category", value_name="Value")

# 为每个类别分配堆叠组
df_melt["StackGroup"] = df_melt["Category"].map({
    "A": "Group 1 (A+B)",
    "B": "Group 1 (A+B)",
    "C": "Group 2 (C+D+E)",
    "D": "Group 2 (C+D+E)",
    "E": "Group 2 (C+D+E)"
})

# 绘制分组堆叠柱状图
fig = px.bar(
    df_melt,
    x="Year",
    y="Value",
    color="Category",
    stackgroup="StackGroup",  # 同一组内的类别自动堆叠
    barmode="group"           # 不同组之间并排展示
)

# 调整布局样式
fig.update_layout(
    title="分组堆叠柱状图",
    xaxis_title="年份",
    yaxis_title="数值"
)
fig.show()

解决方案2:Plotly Graph Objects(灵活可控)

如果需要对每个柱子的样式做精细调整,推荐使用Graph Objects手动添加trace:

import plotly.graph_objects as go

fig = go.Figure()

# 添加第一组堆叠(A+B)
fig.add_trace(go.Bar(
    x=df2["Year"],
    y=df2["A"],
    name="A",
    stackgroup="group1"  # 标记为同一堆叠组
))
fig.add_trace(go.Bar(
    x=df2["Year"],
    y=df2["B"],
    name="B",
    stackgroup="group1"
))

# 添加第二组堆叠(C+D+E)
fig.add_trace(go.Bar(
    x=df2["Year"],
    y=df2["C"],
    name="C",
    stackgroup="group2"
))
fig.add_trace(go.Bar(
    x=df2["Year"],
    y=df2["D"],
    name="D",
    stackgroup="group2"
))
fig.add_trace(go.Bar(
    x=df2["Year"],
    y=df2["E"],
    name="E",
    stackgroup="group2"
))

# 设置布局
fig.update_layout(
    title="分组堆叠柱状图",
    xaxis_title="年份",
    yaxis_title="数值",
    barmode="group"  # 不同堆叠组之间并排
)
fig.show()

核心逻辑

两种方案的核心都是通过stackgroup参数标记哪些类别属于同一堆叠组,不同组之间自动以「分组(并排)」的形式展示,同一组内的类别则自动堆叠。

内容的提问来源于stack exchange,提问作者roy.me

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:06:23