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
相关产品推荐
相关产品推荐

