如何用matplotlib/seaborn按区域绘制职业类别的性别堆叠柱状图
实现方案
核心思路
- 先补全每个业务单元的Manager/Non Manager两个分类,缺失的人数填0,保证所有子图的x轴维度统一
- 用matplotlib创建子图网格,遍历每个业务单元,直接调用pandas内置的
plot(kind='bar', stacked=True)绘制堆叠柱状图即可,无需额外引入seaborn,代码最简洁。
完整代码
import pandas as pd import matplotlib.pyplot as plt # ---------------------- 构造示例DataFrame(你自己有数据可以跳过这步) ---------------------- idx = pd.MultiIndex.from_tuples( [ ("South", "Non Manager"), ("West", "Non Manager"), ("East", "Manager"), ("East", "Non Manager"), ("North", "Manager"), ("North", "Non Manager"), ("Center", "Non Manager"), ], names=["Business Unit", "Professional Category"] ) df = pd.DataFrame( {"Female": [37,31,14,342,5,457,44], "Male": [45,37,15,412,5,550,53]}, index=idx ) # ---------------------- 数据预处理 ---------------------- # 补全所有业务单元的Manager/Non Manager类别,缺失值填0,保证x轴统一显示两个分类 all_cats = ["Manager", "Non Manager"] df_full = df.unstack(fill_value=0).stack().reindex(all_cats, level=1) # ---------------------- 绘图 ---------------------- units = df_full.index.get_level_values("Business Unit").unique() # 创建2行3列子图网格,共享y轴方便跨区域对比 fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(15, 8), sharey=True) axes = axes.flatten() for i, unit in enumerate(units): ax = axes[i] # 提取当前业务单元数据,直接绘制堆叠柱状图 df_unit = df_full.xs(unit, level="Business Unit") df_unit.plot(kind="bar", stacked=True, ax=ax, title=unit, rot=0) ax.set_xlabel("职业类别") # 仅第一个子图显示y轴标签,减少冗余 if i == 0: ax.set_ylabel("人数") # 隐藏最后一个空的子图 axes[-1].axis("off") # 自动调整布局避免重叠 plt.tight_layout() plt.show()
代码说明
- 如果你不需要展示人数为0的分类,直接去掉补全数据的步骤即可,对应子图的x轴只会展示该业务单元存在的职业类别
- 可根据需要调整子图的行列布局、figsize尺寸、颜色等样式参数
内容的提问来源于stack exchange,提问作者Paulo Cortez
相关产品推荐
相关产品推荐

