如何用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
相关产品推荐
相关产品推荐

