如何从含双索引的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
相关产品推荐
相关产品推荐

