Seaborn使用筛选后数据绘制relplot为何出现不存在分类的空坐标轴
问题原因
该现象的根源是pandas分类数据类型的特性,以及Seaborn分面绘图的取值逻辑:
- Seaborn内置的
tips数据集里day列本身是Categorical数据类型,而非普通字符串列,它的分类层级(levels)默认包含['Thur', 'Fri', 'Sat', 'Sun']四个取值。 - 布尔索引仅过滤了数据行,没有修改
day列的元信息,Sat和Sun仍然作为合法的分类层级保留在列属性中。 relplot底层依赖FacetGrid实现分面,处理分类类型的分面字段时,默认会读取该列全部的分类层级来生成分面,而非仅取数据中实际出现的取值,因此会生成两个无数据的空分面。
解决方法
有两种常用方案可以避免空分面出现:
方法1:筛选后移除未使用的分类层级
筛选数据后调用cat.remove_unused_categories()方法,清除day列中无对应数据的分类层级:
import seaborn as sns tips = sns.load_dataset('tips') dataSubset = tips[tips['day'].isin(['Thur', 'Fri'])].copy() # 移除day列未使用的分类层级 dataSubset['day'] = dataSubset['day'].cat.remove_unused_categories() g = sns.relplot(x="total_bill", y="tip", row='day', data=dataSubset, facet_kws={'margin_titles': True}, height=2, aspect=1.5)
方法2:手动指定分面取值顺序
调用relplot时通过row_order参数直接指定需要展示的分面取值,Seaborn会自动忽略分类列的其他层级:
import seaborn as sns tips = sns.load_dataset('tips') dataSubset = tips[tips['day'].isin(['Thur', 'Fri'])] # 手动指定仅生成Thur、Fri两个分面 g = sns.relplot(x="total_bill", y="tip", row='day', row_order=['Thur', 'Fri'], data=dataSubset, facet_kws={'margin_titles': True}, height=2, aspect=1.5)
内容的提问来源于stack exchange,提问作者Thurbs
相关产品推荐
相关产品推荐

