4.3 catplot 类别图工厂 catplot 是分类家族的 figure 级总入口:一个 kind 参数统辖 strip、swarm、box、violin、boxen、bar、count、point 八种图层,分面语法与 displot、relplot 完全一致。 三大图形家族的工厂函数在本书里第三次登场。前两次(displot、relplot)的分面语法已经练熟,本节的重点不在语法——而在"工厂函数什么时候比 axes 级更好",以及用一场完整的多维比较实战给分类家族收官。 kind 全家桶与语法闭环 家族特有参数(violin 的 cut、bar 的 errorbar)直接写在 catplot 调用里,Seaborn 会往下传给对应的 axes 级函数。
catplot 是分类家族的 figure 级总入口:一个 kind 参数统辖 strip、swarm、box、violin、boxen、bar、count、point 八种图层,分面语法与 displot、relplot 完全一致。
三大图形家族的工厂函数在本书里第三次登场。前两次(displot、relplot)的分面语法已经练熟,本节的重点不在语法——而在"工厂函数什么时候比 axes 级更好",以及用一场完整的多维比较实战给分类家族收官。
import seaborn as sns tips = sns.load_dataset('tips') # 八种 kind 里挑四种示范,映射参数完全一致 g1 = sns.catplot(data=tips, x='day', y='total_bill', kind='box') g2 = sns.catplot(data=tips, x='day', y='total_bill', kind='violin', cut=0) g3 = sns.catplot(data=tips, x='day', y='total_bill', kind='bar', errorbar='sd') g4 = sns.catplot(data=tips, x='day', kind='count') # count 不需要 y # 输出说明:四张图共享 x、y 映射,仅图层不同—— # kind 就是分类家族的"图层旋钮",映射层一次写好、四处复用
家族特有参数(violin 的 cut、bar 的 errorbar)直接写在 catplot 调用里,Seaborn 会往下传给对应的 axes 级函数。分面部分与前两章零差异:col、row、col_wrap、height、aspect,返回 FacetGrid,打磨接口同款。
# 分面加分组的组合 g = sns.catplot( data=tips, x='day', y='tip_rate', col='time', hue='smoker', kind='point', dodge=True, height=3.5, aspect=1.2, ) g.set_axis_labels('星期', '小费比例') g.set_titles('{col_name}时段') # 输出说明:Dinner 面板里吸烟与非吸烟两条线几乎平行, # Lunch 面板两条线明显分离——吸烟效应随餐段变化的初步证据
axes 级与 figure 级的选择标准,到分类家族可以完整总结成三条:
背景:经典的泰坦尼克数据,891 名乘客。问题:性别、舱位、登船港对生存率的影响如何交织?
操作分三步,每步一张图:
titanic = sns.load_dataset('titanic') # 第一步:countplot 摸底——各组样本量 g = sns.catplot(data=titanic, x='pclass', hue='survived', kind='count') g.set_axis_labels('舱位等级', '人数') # 输出说明:三等舱人数最多(491 人)且死亡占比最高;头等舱生存者多于遇难者
# 第二步:pointplot 看主效应与交互 g = sns.catplot( data=titanic, x='pclass', y='survived', hue='sex', kind='point', dodge=True, errorbar=('pi', 90), ) g.set_axis_labels('舱位等级', '生存率') # 输出说明:两条线从不交叉——女性生存率在每个舱位都数倍于男性; # 但女性线从 0.97 跌到 0.50,男性线从 0.37 跌到 0.14, # 舱位效应在女性群体中幅度更大
# 第三步:分面拆出儿童维度 titanic['is_child'] = titanic['age'] < 12 g = sns.catplot( data=titanic, x='pclass', y='survived', hue='is_child', col='sex', kind='point', dodge=True, height=3.6, ) g.set_axis_labels('舱位等级', '生存率') g.set_titles('{col_name}性') # 输出说明:男性面板里儿童线全面高于成人线,三等舱男童生存率约 0.42 # 对成人男性约 0.15——"妇女与儿童优先"在数据里的直接体现
结果解读:三张图构成一条完整证据链——先数人头(样本量前提),再看主效应与交互(性别 x 舱位),最后拆出政策变量(儿童优先)。单张图都只是片段,工厂函数的价值正是让这条链的每一环都用同一套映射语法快速拼装。变式:把 x='embarked' 换进来检查登船港是否携带额外信息(它与舱位构成相关,C 港上船的头等舱比例高,生存率的港口差异大部分是舱位的代理效应)。
⚠️ 常见坑:catplot 的
sharey默认共享 y 轴,但生存率这种有自然边界的量,某些面板全距很小(如头等舱女性全在 0.9 以上)时,共享轴会把差异压扁。必要时sharey=False,但要记得在标题里注明刻度不同,防止跨面板误读。
💡 关键直觉:三大工厂函数(displot、relplot、catplot)的分面语法完全同构,学会任何一个,另外两个的参数表可以直接默写——这不是巧合,而是图形语法设计里"映射与图层正交"的直接回报。

本节要点回顾
- kind 是图层旋钮:八种分类图层共享一套映射参数;
- 工厂三定律:分面上工厂、统尺寸上工厂、叠图层回 axes 级;
- 证据链思维:count 摸底、point 看交互、分面拆混杂,三步一个完整论证;
- sharey 是把双刃剑:公平比较靠共享,边界数据可能被压扁;
- 代理效应警惕:港口对生存率的影响大部分来自舱位构成,分类变量之间的相关会伪造因果。
第 4 章收官。第 5 章进入矩阵图:当整张表都是比较对象时,颜色成为唯一的映射通道。