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

Python:如何叠加两个同X轴的Pandas条形图

如何叠加两个同X轴的条形图

嘿,这个需求我之前也碰到过,其实操作起来很清晰,给你一步步拆解:

首先得注意一个关键点:要保证两个条形图的X轴类别完全对齐,不然叠加时会出现错位问题。下面两种方法都能实现叠加效果,你可以根据需求选:

方法一:用Pandas自带的堆叠条形图(简单快捷)

这种方法不用额外写太多代码,只需要把两列的计数结果合并成一个结构统一的DataFrame,再调用堆叠参数就行:

import pandas as pd

df = pd.DataFrame({'a':[1,2,3,1,2,2,2], 'b':[1,1,1,3,2,2,2]})

# 计算两列的频次并按索引排序,确保X轴顺序一致
counts_a = df['a'].value_counts().sort_index()
counts_b = df['b'].value_counts().sort_index()

# 合并成DataFrame,缺失的类别自动补0
combined_counts = pd.DataFrame({'列a': counts_a, '列b': counts_b}).fillna(0)

# 绘制堆叠条形图,stacked=True就是核心参数
combined_counts.plot(kind='bar', stacked=True, figsize=(8,5))

默认是后一列的条形叠在前一列上面,如果你想调换顺序,调整DataFrame的列顺序就行。

方法二:用Matplotlib手动控制堆叠(灵活定制)

如果需要精细调整样式(比如颜色、标签、条形宽度),直接用Matplotlib的bar函数,通过bottom参数指定第二个条形的底部位置:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'a':[1,2,3,1,2,2,2], 'b':[1,1,1,3,2,2,2]})

# 计算频次并排序
counts_a = df['a'].value_counts().sort_index()
counts_b = df['b'].value_counts().sort_index()

# 强制对齐两个系列的索引,缺失类别补0
x = counts_a.index
y_a = counts_a.values
y_b = counts_b.reindex(x, fill_value=0).values

# 创建画布和轴对象
fig, ax = plt.subplots(figsize=(8,5))

# 先画列a的条形作为底层
ax.bar(x, y_a, label='列a', color='#1f77b4')
# 再画列b的条形,bottom=y_a表示把它叠在列a的条形上方
ax.bar(x, y_b, bottom=y_a, label='列b', color='#ff7f0e')

# 添加图表元素
ax.set_xlabel('类别')
ax.set_ylabel('计数')
ax.set_title('叠加条形图')
ax.legend()

plt.show()

这种方法可以自由切换哪个条形在上方,只需要调整bottom参数对应的y值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:35:59