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

如何从含双索引的Python DataFrame用Matplotlib生成堆叠柱状图

用Matplotlib绘制堆叠柱状图的实现步骤

首先需要先整理你的DataFrame,因为原数据中Class列存在空白值,第一步要填充这些缺失值,再将数据转换为适合绘制堆叠图的宽格式:

1. 数据预处理

import pandas as pd
import matplotlib.pyplot as plt

# 构造原始DataFrame
data = {
    'Class': ['One', '', '', 'Two', '', '', 'Three', '', ''],
    'Grade': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
    'Count': [5, 6, 5, 4, 3, 4, 7, 3, 2]
}
df = pd.DataFrame(data)

# 填充Class列的空白值
df['Class'] = df['Class'].ffill()

# 转换为宽格式:行是Class,列是Grade,值是Count
pivot_df = df.pivot(index='Class', columns='Grade', values='Count').reset_index()

2. 绘制堆叠柱状图

# 设置x轴的位置和标签
x = range(len(pivot_df['Class']))
class_labels = pivot_df['Class']
grades = ['A', 'B', 'C']

# 初始化底部位置,用于堆叠
bottom = [0]*len(x)

# 循环绘制每个Grade的堆叠部分
for grade in grades:
    counts = pivot_df[grade]
    plt.bar(x, counts, bottom=bottom, label=grade)
    # 更新底部位置,为下一层堆叠做准备
    bottom = [b + c for b, c in zip(bottom, counts)]

# 设置图表属性
plt.xticks(x, class_labels)
plt.xlabel('Class')
plt.ylabel('Count')
plt.title('Class vs Count (Stacked by Grade)')
plt.legend(title='Grade')

plt.tight_layout()
plt.show()

代码说明

  • ffill()方法用来填充Class列的空白值,让每个子项都对应正确的Class分类。
  • pivot()方法将长格式数据转换为宽格式,每个Grade成为单独的列,方便后续按列绘制堆叠部分。
  • 循环绘制每个Grade的柱状图时,通过bottom参数控制每层的起始位置,实现堆叠效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:42:27