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

Seaborn使用筛选后数据绘制relplot为何出现不存在分类的空坐标轴

问题原因

该现象的根源是pandas分类数据类型的特性,以及Seaborn分面绘图的取值逻辑:

  1. Seaborn内置的tips数据集里day列本身是Categorical数据类型,而非普通字符串列,它的分类层级(levels)默认包含['Thur', 'Fri', 'Sat', 'Sun']四个取值。
  2. 布尔索引仅过滤了数据行,没有修改day列的元信息,Sat和Sun仍然作为合法的分类层级保留在列属性中。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:36:07