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

基于两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:13:03