Seaborn可视化核心在于匹配数据类型与关系:分类变量间用countplot/catplot看频次分布,分类+数值用boxplot/violinplot对比分布,数值间用scatterplot/lmplot分析趋势,支持hue/col分组拟合回归线。

用 Seaborn 做分类与回归可视化,关键不是堆函数,而是搞清数据类型和想表达的关系:分类变量之间看分布与差异,数值变量之间看趋势与拟合,而分类+数值组合则常用于分组对比。下面直接上实用场景和对应图表。
分类变量之间的关系:用 countplot 或 catplot 统计频次
比如调查不同性别(sex)和是否吸烟(smoker)的组合出现多少次,适合用柱状频次图。countplot 默认统计 x 轴变量的出现次数;若要同时观察两个分类变量,推荐用 catplot 搭配 kind='count',自动分面更清晰。
- 代码示例:sns.catplot(data=tips, x='sex', hue='smoker', kind='count') —— 按性别分组,再用颜色区分吸烟状态
- 注意:避免对高基数分类变量(如用户ID)直接 countplot,会挤成一团;可先聚合或筛选 top-N 类别
- 若需百分比堆叠效果,可用 sns.histplot 配合 stat='percent' 和 multiple='fill'
分类变量 vs 数值变量:用 boxplot、violinplot 或 swarmplot 对比分布
这是最常见需求:比如比较不同星期(day)的小费(tip)分布。boxplot 展示中位数、四分位距和异常值;violinplot 补充密度信息;swarmplot 显示每个点位置,适合样本量不大时。
- 推荐组合:sns.catplot(data=tips, x='day', y='tip', kind='violin', inner='box') —— 小提琴轮廓 + 内嵌箱线
- 若点太多重叠,加 dodge=True(配合 hue)或改用 stripplot 并设置 jitter=0.2
- 注意顺序:默认按字母排,想按业务逻辑(如 Thu→Fri→Sat→Sun),传入 order=['Thu','Fri','Sat','Sun']
数值变量之间的关系:用 scatterplot 或 lmplot 揭示趋势与线性关联
比如分析总账单(total_bill)和小费(tip)是否正相关。scatterplot 展示原始散点;lmplot 自动添加回归线(含置信区间),并支持按分类变量分面或着色。
立即学习“Python免费学习笔记(深入)”;
- 基础回归:sns.lmplot(data=tips, x='total_bill', y='tip', col='time') —— 分早/晚两列拟合
- 想关闭置信带?加 ci=None;换高阶拟合?用 order=2(二次曲线)
- 若点密集看不清趋势,可用 sns.regplot 配合 scatter=False 只画回归线
带分类调节的回归:用 hue 或 col 实现分组建模
真正体现 Seaborn 优势的地方——同一张图里,不同子组各自拟合回归线。比如“男性 vs 女性顾客,账单与小费的关系是否不同?”
- 代码:sns.lmplot(data=tips, x='total_bill', y='tip', hue='sex', markers=['o','s'], scatter_kws={'alpha':0.6})
- 注意:hue 分组后,每组样本量不能太少,否则回归线不稳定;可先用 tips.groupby('sex').size() 检查
- 若想固定斜率(即只平移截距),需手动构造哑变量建模,Seaborn 不直接支持;此时建议转 pandas + statsmodels
不复杂但容易忽略:所有图表都依赖数据清洗质量。绘图前务必检查缺失值(tips.isna().sum())、异常值(如 tip 为负)、数据类型(category vs object)。Seaborn 很聪明,但不会替你判断“星期三”该是 category 还是 str。








