如何在seaborn柱状图x轴展示计数为0的指定顺序分类项
Seaborn固定分类顺序、显示0计数分类柱状图实现方法
核心思路是先通过pandas分类类型预设所有需要展示的类别和固定顺序,避免未出现的分类被统计函数自动过滤,再传入seaborn绘图即可。
- 预定义严格要求的分类顺序列表,和血压分类函数返回的类别顺序完全一致
- 将存储分类结果的
bp_class列转换为pandas有序分类类型,显式指定所有预设类别,未在数据中出现的类别会被保留 - 统计频次时不需要额外自动排序,所有类别(含计数为0的类别)都会被统计到
- 绘图时再次传入分类顺序参数,双重保障x轴展示顺序符合要求
完整可运行代码如下:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 定义固定的血压分类顺序,严格匹配需求 bp_category_order = ["normal", "elevated", "stage1", "stage2", "crisis"] # 将目标列转换为指定规则的分类类型 df_simple["bp_class"] = pd.Categorical( df_simple["bp_class"], categories=bp_category_order, ordered=True ) # 统计各分类频次,此时会自动包含观测数为0的分类 bp_counts = df_simple["bp_class"].value_counts(sort=False) # 绘制柱状图 sns.set_theme(style="whitegrid") # 可选,设置绘图风格 ax = sns.barplot( x=bp_counts.index, y=bp_counts.values, order=bp_category_order # 显式指定x轴顺序,避免排序错乱 ) # 可选:在每个柱子上方标注具体计数值 ax.bar_label(ax.containers[0]) plt.show()
执行后统计得到的频次结果如下,可以看到原本缺失的stage2、crisis分类计数为0,会正常展示在图中:
normal 37 elevated 15 stage1 34 stage2 0 crisis 0 Name: bp_class, dtype: int64
注意:如果不提前将列转为指定类别的Categorical类型,
value_counts()会自动丢弃没有观测值的分类,仅返回数据中实际存在的3个分类,无法满足展示全部分类的要求。
内容的提问来源于stack exchange,提问作者Robert Alexander
相关产品推荐
相关产品推荐

