基于两个DataFrame绘制Matplotlib堆叠柱状图的问题咨询
嘿,我来帮你搞定这个堆叠柱状图的问题!其实完全不用把DataFrame转成列表,Matplotlib和Pandas配合得非常顺畅,直接用DataFrame的数据就能轻松实现堆叠效果。我给你分两种常见场景来讲解,你可以根据自己的需求选:
场景1:同一类别下堆叠两个DataFrame的数据
假设你的两个DataFrame有着相同的索引(也就是x轴的类别),比如一个是"基础数据",一个是"额外数据",要把它们叠在同一个柱子里:
import matplotlib.pyplot as plt import pandas as pd import numpy as np # 先构造示例DataFrame(替换成你自己的数据) df_base = pd.DataFrame( {'产品A': [120, 150, 180], '产品B': [90, 110, 130]}, index=['Q1', 'Q2', 'Q3'] ) df_extra = pd.DataFrame( {'产品A': [30, 40, 50], '产品B': [20, 25, 30]}, index=['Q1', 'Q2', 'Q3'] ) # 设置x轴位置和柱子宽度 x = np.arange(len(df_base.index)) bar_width = 0.4 # 先画底部的基础数据,再叠加上额外数据 bottom = np.zeros(len(x)) # 初始底部为0 # 遍历df_base的列,画出基础层 for col in df_base.columns: plt.bar(x, df_base[col], bar_width, bottom=bottom, label=f'基础 - {col}') bottom += df_base[col] # 更新底部位置,为下一层做准备 # 遍历df_extra的列,堆叠在基础层之上 for col in df_extra.columns: plt.bar(x, df_extra[col], bar_width, bottom=bottom, label=f'额外 - {col}') bottom += df_extra[col] # 美化图表 plt.xticks(x, df_base.index) # 设置x轴标签为类别 plt.title('季度产品销量(基础+额外)') plt.ylabel('销量') plt.legend(loc='upper left') plt.tight_layout() plt.show()
场景2:两组独立的堆叠柱状图(对比两个DataFrame)
如果想把两个DataFrame作为独立的组(比如"2023年"和"2024年"),每组内部是堆叠的,只需要把两组柱子的x轴位置错开:
# 沿用上面的示例DataFrame,假设df_base是2023年,df_extra是2024年 x1 = x - bar_width/2 # 第一组柱子的位置 x2 = x + bar_width/2 # 第二组柱子的位置 # 画2023年的堆叠柱 bottom_2023 = np.zeros(len(x)) for col in df_base.columns: plt.bar(x1, df_base[col], bar_width, bottom=bottom_2023, label=f'2023 - {col}') bottom_2023 += df_base[col] # 画2024年的堆叠柱 bottom_2024 = np.zeros(len(x)) for col in df_extra.columns: plt.bar(x2, df_extra[col], bar_width, bottom=bottom_2024, label=f'2024 - {col}') bottom_2024 += df_extra[col] # 美化图表 plt.xticks(x, df_base.index) plt.title('2023 vs 2024 季度产品销量') plt.ylabel('销量') plt.legend(loc='upper left') plt.tight_layout() plt.show()
关键注意事项
- 索引对齐:两个DataFrame的索引必须完全一致,不然x轴的类别会对应混乱;
- bottom参数:这个是实现堆叠的核心,它接受和柱子长度相同的数组,直接用DataFrame的列(比如
df_base[col])就行,根本不用转成列表; - 柱子宽度:如果是两组对比的情况,宽度要设置合理,避免柱子重叠。
如果你的图表还是不显示,大概率是没加plt.show(),或者DataFrame的结构有问题(比如索引不对齐),可以检查一下这两点~
内容的提问来源于stack exchange,提问作者DatCra
相关产品推荐
相关产品推荐

