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

