Plotly Express实现指定列的分组堆叠柱状图求助
解决Plotly实现指定列分组堆叠柱状图的问题
原代码问题分析
你的代码存在两个关键问题:
y参数错误包含了Year列(这是x轴的分组依据,不应作为y轴数值列)- 仅用
barmode="group"会将所有y列视为独立分组,无法实现「部分列堆叠、组间分组」的混合效果
解决方案1:Plotly Express(简洁高效)
通过数据重塑+stackgroup参数实现需求,步骤如下:
- 将宽表转为长表,并为每个类别标记所属堆叠组
- 利用
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
相关产品推荐
相关产品推荐

