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

如何在Seaborn中快速创建堆叠Countplot?无需手动统计

快速创建堆叠计数图(无需手动计数)

当然可以!你完全不用手动统计每个类别的计数值,用pandas配合matplotlib就能一步搞定这个需求,全程省去额外的计数步骤。针对你给出的数据集,我给你两种实用的实现方式:

方法一:Pandas内置堆叠条形图(最简方案)

Pandas的crosstab函数会自动帮你完成分组计数,直接生成适合堆叠图的格式,然后调用绘图方法即可:

import pandas as pd
import matplotlib.pyplot as plt

# 你的数据集
df = pd.DataFrame({'ID':[123,224,336,487,532,923, 987, 109, 289, 884], 
                   'YOB':[1991, 1992, 1993, 1992, 1991, 1991, 1991, 1992, 1993, 1992], 
                   'CoD':[1,1,2,2,1,2,2,1,2,1]})

# 自动计数+绘制堆叠图
count_table = pd.crosstab(df['YOB'], df['CoD'])
ax = count_table.plot(kind='bar', stacked=True, figsize=(8,5))

# 美化图表
plt.title('Stacked Count of CoD by Year of Birth')
plt.xlabel('Year of Birth')
plt.ylabel('Total Count')
plt.legend(title='CoD Category')
plt.tight_layout()
plt.show()

为什么这个方法好用?

  • pd.crosstab(df['YOB'], df['CoD'])会自动统计每个出生年份下,不同CoD类别的数量,完全不用你手动计算;
  • 只需要加上stacked=True参数,就直接生成堆叠条形图,每个条形的高度对应该年份的总人数,不同颜色对应CoD的分类,完美展示CoD=1的占比和计数。

方法二:高亮CoD=1的堆叠图(突出目标类别)

如果你想重点突出CoD=1的部分,可以在绘图后给对应条形添加样式:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'ID':[123,224,336,487,532,923, 987, 109, 289, 884], 
                   'YOB':[1991, 1992, 1993, 1992, 1991, 1991, 1991, 1992, 1993, 1992], 
                   'CoD':[1,1,2,2,1,2,2,1,2,1]})

count_table = pd.crosstab(df['YOB'], df['CoD'])
ax = count_table.plot(kind='bar', stacked=True, colormap='coolwarm', figsize=(8,5))

# 给CoD=1的条形添加斜线填充,突出显示
for patch in ax.patches:
    if patch.get_label() == '1':
        patch.set_hatch('//')
        patch.set_alpha(0.8)

plt.title('Stacked Count of CoD by Year of Birth (CoD=1 Highlighted)')
plt.xlabel('Year of Birth')
plt.ylabel('Total Count')
plt.legend(title='CoD Category')
plt.tight_layout()
plt.show()

这样处理后,CoD=1的部分会更醒目,一眼就能看到每个年份里CoD=1的人数占比和具体数量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:52:45