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

如何用Seaborn生成指定顺序的分类归一化计数图表?

实现按指定顺序的分类归一化计数图表

方案1:直接使用新版Seaborn的countplot(推荐,版本≥0.11)

Seaborn 0.11及以上版本的countplot新增了stat参数,支持将计数转换为百分比/概率,同时保留order参数指定类别顺序。直接修改你的原有代码即可:

import seaborn as sns

# 获取前10个高频category_1的顺序
top_cats = df['category_1'].value_counts().iloc[:10].index

# 绘制归一化(百分比)的计数图,按指定顺序排列
sns.countplot(
    data=df,
    y="category_1",
    hue='category_2',
    order=top_cats,
    stat='percent'  # 归一化为百分比,也可使用stat='probability'得到概率值
)

方案2:预处理数据后用barplot绘制(兼容旧版本)

如果你的Seaborn版本较低,不支持stat参数,可以手动计算每个类别下的归一化占比,再用barplot绘制:

import seaborn as sns
import pandas as pd

# 1. 计算每个category_1下各category_2的计数,再归一化为百分比
counts = df.groupby(['category_1', 'category_2']).size().reset_index(name='count')
total_counts = df.groupby('category_1')['category_2'].count().reset_index(name='total')
normalized = counts.merge(total_counts, on='category_1')
normalized['percent'] = (normalized['count'] / normalized['total']) * 100

# 2. 获取前10个高频category_1的顺序
top_cats = df['category_1'].value_counts().iloc[:10].index

# 3. 用barplot绘制,指定order参数
sns.barplot(
    data=normalized,
    y="category_1",
    x="percent",
    hue='category_2',
    order=top_cats
)

方案3:用histplot配合有序分类指定顺序

如果偏好使用histplot,可以先将category_1转换为有序分类类型,指定顺序后histplot会自动遵循该顺序:

import seaborn as sns
import pandas as pd

# 获取前10个高频category_1的顺序
top_cats = df['category_1'].value_counts().iloc[:10].index

# 将category_1转换为有序分类,固定顺序
df['category_1'] = pd.Categorical(df['category_1'], categories=top_cats, ordered=True)

# 用histplot绘制归一化计数图
sns.histplot(
    data=df,
    y="category_1",
    hue='category_2',
    stat='probability',  # 归一化为概率,也可使用stat='percent'
    multiple='stack'  # 堆叠显示不同category_2的占比,可选'dodge'实现并列显示
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:20:44