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

如何用matplotlib/seaborn按区域绘制职业类别的性别堆叠柱状图

实现方案

核心思路

  1. 先补全每个业务单元的Manager/Non Manager两个分类,缺失的人数填0,保证所有子图的x轴维度统一
  2. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 09:36:03