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

如何用Matplotlib/Seaborn绘制双分类列的堆叠条形图?

解决Python堆叠条形图按性别拆分流失/未流失群体的问题

嘿,别担心,刚接触Python绘图时,把逻辑转成代码确实容易卡壳,你的需求用堆叠条形图完全没问题,这正是展示分组计数的好工具!

你之前的代码df.Churn.value_counts().plot(kind='bar')只统计了流失/未流失的总数,没按性别拆分,核心问题是没先把数据按churned和gender两个维度做分组计数。下面是具体的解决步骤:

1. 先整理数据:生成交叉统计表

我们需要先统计每个churned类别(0/1)下,不同gender的人数。用pandas的pd.crosstab()就能快速实现:

import pandas as pd
import matplotlib.pyplot as plt

# 先创建你提供的示例数据(实际用你的真实数据就行)
data = {
    'gender': ['male', 'male', 'female', 'female', 'female', 'male'],
    'churned': [0, 1, 0, 1, 1, 1]
}
df = pd.DataFrame(data)
# 把churned转成category类型(如果你的数据还没转的话)
df['churned'] = df['churned'].astype('category')

# 生成交叉表:行是churned,列是gender,值是对应人数
cross_tab = pd.crosstab(index=df['churned'], columns=df['gender'])

执行完后,cross_tab的结构是这样的:

gender   female  male
churned              
0             1     1
1             2     2

2. 绘制堆叠条形图

用这个交叉表直接调用plot()方法,设置stacked=True就能得到堆叠效果:

# 绘制堆叠条形图
ax = cross_tab.plot(kind='bar', stacked=True, color=['#ff9999','#66b3ff'])

# 美化图表(可选,但让结果更直观)
plt.title('流失/未流失群体的性别分布')
plt.xlabel('用户状态')
plt.ylabel('人数')
# 把x轴的0/1改成中文标签
ax.set_xticklabels(['未流失', '流失'], rotation=0)
# 调整图例位置
plt.legend(title='性别')

# 显示图表
plt.show()

代码解释

  • pd.crosstab():专门用来统计两个分类变量的交叉计数,完美匹配你需要的“按流失状态拆分性别人数”的需求。
  • stacked=True:这是实现堆叠效果的关键参数,把同一x轴类别下的不同gender条形叠在一起。
  • 美化部分:把x轴的数字换成中文标签,添加标题和轴标签,让图表可读性更强。

这样你就能得到想要的图表:x轴是“未流失”和“流失”,每个条形里用不同颜色区分男性和女性的数量啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:37:52