如何基于多层索引DataFrame为每个category_1绘制饼图和柱状图?
分层索引DataFrame的分组可视化实现
数据准备(中文翻译后)
先将原英文数据转换为中文格式,构建带分层索引的DataFrame:
import pandas as pd import matplotlib.pyplot as plt # 构建中文分层索引数据集 data = { '数量': [220, 176, 156, 144, 104, 224, 188, 140, 128, 120], '占比(%)': [27.5, 22, 19.5, 18, 13, 28, 23.5, 17.5, 16, 15] } index = pd.MultiIndex.from_tuples( [ ('母婴儿童', '婴儿护理'), ('母婴儿童', '玩具'), ('母婴儿童', '男童服饰'), ('母婴儿童', '女童服饰'), ('母婴儿童', '男婴服饰'), ('女装', '派对礼服'), ('女装', '运动服饰'), ('女装', '泳装'), ('女装', '冬季服饰'), ('女装', '腕表') ], names=['一级品类', '二级品类'] ) df = pd.DataFrame(data, index=index)
分组绘图代码
针对每个一级品类,分别绘制二级品类的占比饼图和数量柱状图:
# 遍历每个一级品类分组 for 一级品类, 分组数据 in df.groupby(level='一级品类'): # 创建包含两个子图的画布 fig, (饼图轴, 柱状图轴) = plt.subplots(1, 2, figsize=(12, 6)) # 绘制占比饼图 饼图轴.pie( 分组数据['占比(%)'], labels=分组数据.index.get_level_values('二级品类'), autopct='%1.1f%%', startangle=90 ) 饼图轴.set_title(f'{一级品类} - 二级品类占比') 饼图轴.axis('equal') # 保证饼图为正圆形 # 绘制数量柱状图 柱状图轴.bar( 分组数据.index.get_level_values('二级品类'), 分组数据['数量'] ) 柱状图轴.set_title(f'{一级品类} - 二级品类数量') 柱状图轴.set_xlabel('二级品类') 柱状图轴.set_ylabel('数量') # 旋转x轴标签避免重叠 plt.setp(柱状图轴.get_xticklabels(), rotation=45, ha='right') # 自动调整布局,防止内容截断 plt.tight_layout() plt.show()
关键说明
- 用
groupby(level='一级品类')按第一层索引拆分数据,自动隔离每个一级品类的子数据集 - 饼图通过
pie方法实现,autopct控制百分比显示格式,axis('equal')确保饼图形状规整 - 柱状图通过
bar方法实现,旋转x轴标签解决长品类名称重叠问题 tight_layout()自动调整子图间距,避免标题、标签被画布截断
内容的提问来源于stack exchange,提问作者Priyank Patel
相关产品推荐
相关产品推荐

