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

Pandas是否有内置函数实现差值堆叠柱状图?

实现非累加的堆叠柱状图(差值/基线为0的堆叠)

我完全明白你的需求——默认的堆叠柱状图会把系列数值累加,导致后一个系列的终点是前面所有数值的总和,但你想要的是让每个系列的终点就是自身的数值,而非累加结果。下面我会给出两种贴合你需求的实现方式,都能结合Pandas快速完成:

方法1:绘制基线为0的重叠堆叠柱状图

如果你的目标是让每个系列的柱状图都从y轴0开始,高度等于自身数值(视觉上重叠,对应你说的左侧效果),可以不用Pandas的stacked=True,而是手动循环每个系列调用plt.bar,设置相同的x坐标即可:

import pandas as pd
import matplotlib.pyplot as plt

# 构造和你描述匹配的示例数据
data = {
    "category": ["X", "X"],
    "series": ["s1", "s2"],
    "value": [2, 6]
}
df = pd.DataFrame(data)

# 转换为透视表,方便按系列提取数据
pivot_df = df.pivot(index="category", columns="series", values="value")

# 获取x轴位置和柱状图宽度
x = range(len(pivot_df.index))
bar_width = 0.4

# 逐个绘制系列,相同x位置实现重叠堆叠
plt.bar(x, pivot_df["s1"], width=bar_width, label="s1", color="#1f77b4")
plt.bar(x, pivot_df["s2"], width=bar_width, label="s2", color="#ff7f0e", alpha=0.7)

# 设置图表样式
plt.xticks(x, pivot_df.index)
plt.ylabel("数值")
plt.legend()
plt.title("基线为0的重叠堆叠柱状图")
plt.show()

这种方式下,s1的终点是2,s2的终点是6,完全匹配你想要的左侧效果,还能轻松扩展到更多系列。

方法2:调整数据实现“差值堆叠”(总高度等于最大数值)

如果你想要的是堆叠后总高度等于最大系列的数值(比如s2=6,总高度就是6),可以先对宽格式数据做差值处理,再用Pandas的堆叠柱状图:

# 沿用上面的透视表数据
# 按列计算差值:从第二个系列开始,每个系列数值减去前一个系列的数值,第一个系列保留原值
diff_df = pivot_df.diff(axis=1).fillna(pivot_df)

# 绘制堆叠柱状图
diff_df.plot(kind="bar", stacked=True, color=["#1f77b4", "#ff7f0e"])
plt.ylabel("数值")
plt.title("差值堆叠柱状图(总高度等于最大数值)")
plt.show()

这种方式下,s1高度为2,s2高度为4(6-2),堆叠后总高度为6,s2的终点正好是6,也符合你描述的需求。

为什么你的diff()尝试不符合预期?

你之前用diff()可能是直接对原始长格式数据调用的,而diff(axis=1)需要在宽格式数据(每个系列作为一列)上使用,才能正确计算列与列之间的差值,得到符合要求的堆叠高度。

内容的提问来源于stack exchange,提问作者Arnfried

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:13:47