如何让Seaborn绘制的DataFrame子集柱状图与pandas plot效果一致?
解决Seaborn绘制DataFrame子集显示全部分类的问题
原因很明确:你的names列是分类类型,Seaborn默认会保留该列的所有原始分类类别,哪怕你只取了前10行的子集,它还是会渲染全部50个类别(无数据的位置为空);而pandas的绘图工具会自动只展示子集里实际存在的类别。
下面是两种简单的解决方法:
方法1:重置子集的分类类别
取子集后,移除分类列中未被使用的类别,这样Seaborn就只会识别子集里存在的10个类别:
# 取前10行子集并复制,避免修改原DataFrame df_subset = df.head(10).copy() # 移除未使用的分类 df_subset['names'] = df_subset['names'].cat.remove_unused_categories() # 绘图 sns.barplot(data=df_subset, x='names', y='values')
方法2:指定绘图的显示顺序
不需要修改子集的分类结构,直接在barplot中用order参数限定要显示的类别:
df_subset = df.head(10) # 用子集的names列指定显示顺序,只展示这些类别 sns.barplot(data=df_subset, x='names', y='values', order=df_subset['names'])
两种方法都能让Seaborn的柱状图和pandas plot效果一致,你可以根据需求选择:第一种会永久修改子集的分类属性,后续用该子集绘图都无需再设置;第二种只是临时作用于当前绘图,不改变子集本身。
内容的提问来源于stack exchange,提问作者rustadd
相关产品推荐
相关产品推荐

