
提到seaborn估计不少初学数据分析的朋友都有这种经历打开官方文档函数列表长得像超市货架什么scatterplot、lineplot、boxplot、violinplot、kdeplot、jointplot……一眼望不到头每个好像都得背下来但真正用的时候又拿不准该用哪个。标题里写的“seabon”应该是“seaborn”的笔误不过这个笔误不重要重要的是后面那句从函数分类来看。这个角度我觉得特别对因为seaborn之所以看起来难学恰恰是因为你把它当成了一堆孤立的函数一旦你把它的函数体系按分类梳理清楚整张图就豁然开朗了。这篇文章我就结合自己的实战经验带大家把seaborn的函数从头到尾按类型拆一遍顺便说说每个分类背后的设计逻辑、适用场景以及我踩过的那些坑。1. 为什么我建议从函数分类开始学seaborn而不是背函数1.1 我的弯路抄了半个月代码才发现的规律最早我学seaborn的时候完全是被动式的用法。今天要画个散点图就搜scatterplot明天要画箱线图又搜boxplot。代码是能跑但每次换一个数据集、换一个分析方向我就得重新查一遍文档效率低得可怕。后来有次做综合练习需要用同一个数据集同时画散点图、分布图、分类箱线图我才发现这三个图之间居然存在一个上下位的调用关系——scatterplot其实是relplot的一个子集boxplot其实是catplot的子集而kdeplot、histplot都被整合在displot里。那一刻我意识到seaborn不是随机堆了不少函数而是有意识地把函数按“要回答什么问题”分成了几大类。这件事对我触动很大因为很多教程上来就教你plt.subplots加ax.scatter或者直接摆出十几个API却没有人点破seaborn内部的分类逻辑。结果就是你背了一堆函数名但遇到真实的分析任务还是不知道从哪个门进去。相反如果你脑子里先有一个“分类框架”哪怕你忘了某一个具体函数的名字也能通过类别反推出来。1.2 函数分类其实是一张“可视化决策地图”我用一个类比来解释为什么分类重要seaborn像一座图书馆里面的书是按主题分区的。你借书的时候不会满馆乱逛而是先确定你要的是“小说”还是“科普”再进入对应的书架。seaborn的函数分类也是这样——它通盘回答了三个最底层的问题你要看两个变量之间的关系吗进“关系图”分类。你要看一个或者多个变量的分布形态吗进“分布图”分类。你需要对比不同类别的差异吗进“分类图”分类。这三类之外还有回归图、矩阵图这样的“特种书架”。当你把seaborn的API理解成这么一张决策地图选函数就不再是死记硬背而是顺着分析目标一步步走下决策分支。这也是我写这篇文章的初衷帮大家把这张地图画出来以后拿到任何数据都能照着地图找到正确的绘图函数。2. seaborn的函数体系到底怎么分层2.1 图级函数与轴级函数理解API设计的支点在拆具体分类之前必须先搞清一个贯穿整个seaborn的分层概念图级函数figure-level和轴级函数axes-level。这是seaborn一切API设计的基础也是新手最容易混淆的地方。图级函数的名字基本都以*plot结尾比如relplot、displot、catplot、lmplot、pairplot、jointplot。它们的特点是一次调用就会自动创建整个Figure画布并且可以分割出多个子图。你想按某种变量分列、分行图级函数直接用col、row参数就搞定了。轴级函数则比如scatterplot、lineplot、histplot、kdeplot、boxplot、violinplot等。它们只负责在当前已有的坐标系Axes上画一层图形不创建新画布也不管子图切分。你通常会先建好matplotlib的Figure和Axes对象然后把轴级函数一把ax参数传进去。用一个表来对照层级函数示例画布管理适合场景图级函数relplot/displot/catplot/pairplot自动创建整套图要分面、要比较多个子图轴级函数scatterplot/histplot/boxplot绘制在指定Axes上画单幅图或嵌入自定义布局记住这个分层之后你会发现很多困惑瞬间解开。例如有人问为什么relplot里能传col而scatterplot里传不了因为scatterplot是轴级函数它没有能力管理整张画布分面是relplot承担的责任。同理displot和histplot的关系也不是“两个不同的函数”而是“同一个绘图逻辑的两种胶囊”。2.2 四大分类模块关系、分布、分类、回归与矩阵在“分层”之上seaborn还按统计图形类型做了二次分类。我把它体系化为四个模块再加上一个画布工具模块关系图模块核心是relplot下面挂scatterplot、lineplot。用于探索数值型变量之间的相互影响。分布图模块核心是displot下面挂histplot、kdeplot、ecdfplot、rugplot。用于看数据和分布形态。分类图模块核心是catplot下面挂stripplot、swarmplot、boxplot、violinplot、boxenplot、pointplot、barplot、countplot。用于处理含离散分类变量的场景。回归图与矩阵图模块回归图包含regplot、lmplot、residplot矩阵图包含heatmap、jointplot、pairplot、clustermap。这个分类不是官方文档里完全照搬的说法官方文档把关系、分布、分类拆成三个大板块回归和矩阵各自独立但它足够概括seaborn的核心函数也方便记忆。模块之间不是说“不能混用”而是说每个模块解决一类典型问题。举个例子你可以用scatterplot绘制离散点后再叠加histplot当坐标轴边框的分布这是组合用的常见手法并不冲突。3. 关系图、分布图、分类图三大主力分类的适用场景与案例3.1 关系图relplot体系探寻变量间相互影响relplot是关系图的总入口它的两个轴级子函数是scatterplot和lineplot。你可能会问散点图不就是直接画坐标点吗为什么还要包一层relplot核心原因在于relplot支持语义映射参数hue按颜色区分size按点大小区分style按形状区分col和row按子图分面。这四个映射组合起来一张散点图就能表达五六个维度的信息。举个我常用到的场景分析某模拟平台用户消费行为想同时看“消费金额”和“购买次数”的关系还想知道“不同会员等级”之间的差异。如果用scatterplot代码是import seaborn as sns import pandas as pd # 假设data是长格式DataFrame包含金额、次数、会员等级、周几 sns.scatterplot(datadata, x消费金额, y购买次数, hue会员等级)这样能看出颜色差异但如果还要按“周几”分列观察变化趋势就要转用relplotsns.relplot( datadata, x消费金额, y购买次数, hue会员等级, col周几, kindscatter # 默认就是scatter也可以填line )kindscatter代表用散点图来画关系换成kindline就变成折线关系图。这张图会自动变成一排子画布非常直观。实话说relplot最容易被忽略的是线条场景。很多人以为关系图只用来画散点其实时间序列这种“x轴有天然顺序”的数据用relplot(kindline)加hue和style比手动循环plt.plot快得多。它还能自动聚合重复x值省去提前算均值的步骤。3.2 分布图displot体系观察单个或多个变量的形态displot是分布图的集成入口整合了原来的histplot、kdeplot、ecdfplot以及一个辅助性的rugplot。分布图要回答的问题是我的数据长什么样集中在哪个区间有没有明显的峰值或长尾这个分类在探索性数据分析阶段几乎是必用的。最基础的用法是看单变量直方图sns.displot(datadata, x消费金额, kindhist)kind参数支持切换成kde核密度曲线和ecdf经验累积分布函数。我自己的习惯是先用hist看直方图发现分布有双峰或偏斜后再叠加kde看平滑曲线sns.displot(datadata, x消费金额, kindkde, hue会员等级)displot同样支持hue、col、row所以想看不同组别的分布对比非常容易。还有一个值得一提的点可以传两个变量进去画二维直方图或二维核密度图这时displot变成了“分布热力图”sns.displot(datadata, x消费金额, y购买次数, kindkde, thresh0.05)这种图在分析两个连续变量的聚集区域时特别好用尤其是当你发现散点图重叠太严重、看不清密度的时候。3.3 分类图catplot体系对付非数值型维度说到分类图这是seaborn里函数最多的一个模块也是很多初学者最头疼的地方boxplot、violinplot、stripplot、swarmplot、barplot、pointplot、countplot……名字都像到底什么时候用哪个其实理解了catplot的分类逻辑就不乱了。catplot的入口统一用kind参数切换具体的轴级图。按照“展示原始数据点”和“展示统计汇总”两条线索可以分成展示分布形态box箱线图、boxen增强箱线图、violin小提琴图。展示原始数据点strip散点分布、swarm蜜蜂群图。展示统计汇总bar柱状图、point点图、count频数图。我处理真实数据时的选择标准很简单如果样本量不大几千条以内我会先用swarm画蜂群图既能看见每个样本的位置又不重叠样本量大了swarm会画出很长的尾巴性能也下降就换box或violin。例如sns.catplot(datadata, x会员等级, y消费金额, kindviolin)这里x是分类变量y是连续变量kindviolin同时展示分布和分位数。如果还想看到底有没有异常值可以叠加stripsns.catplot(datadata, x会员等级, y消费金额, kindviolin, innerNone) sns.catplot(datadata, x会员等级, y消费金额, kindstrip, alpha.5)注意单独调用两次catplot会生成两张图如果想叠加到同一张图上就要用轴级函数在小提琴图上继续画散点。这种“先用图级函数把布局搭好再用轴级函数往里面加细节”的组合是后面讲到的进阶技巧。countplot这个函数也很容易被忽略其实它等价于catplot(kindcount)专门用来画离散变量的频数分布。比如看会员等级的分布一个countplot就够了不需要自己value_counts再画柱状图sns.catplot(datadata, x会员等级, kindcount)4. 回归图与矩阵图函数分类里容易被忽略的王牌4.1 回归图从散点里找出趋势线回归图这个分类经常被划到关系图里但seaborn把它单独拿出来说明它有自己的位置。核心函数是regplot和lmplot。regplot是轴级函数lmplot则是它的图级版额外支持hue、col、row。很多人以为回归图就是“画完散点再画一条拟合线”其实没那么简单。regplot能自动计算置信区间画出来的阴影带代表拟合线的不确定性。我通常用它来做两个连续变量的初步探索看看有没有线性趋势顺带检测异常点。sns.regplot(datadata, x消费金额, y购买次数)如果有多组对比那就用lmplotsns.lmplot(datadata, x消费金额, y购买次数, hue会员等级)这里有个技术细节regplot和lmplot都支持order参数设置多项式回归的阶数。数据明显是曲线关系时设置order2就能拟合二次曲线。还有x_bins和x_ci这种参数可以把x分成几段再计算均值置信区间画出来是类似折线的效果在探索非线性关系时很好用。回归图实际分析中还有一个常被忽略的点用residplot看残差。你拟合完线性回归后如果残差图呈现出有规律的结构说明模型假设不成立比如漏掉了强非线性项。seaborn提供了专门的residplot直接画残差分布不需要自己调用sklearn算完再画。4.2 矩阵图一图看完所有两两关系矩阵图分类中pairplot和heatmap是数据分析里出场率极高的两个函数。pairplot能把数据集中所有数值型列两两组合的散点图画成一个矩阵对角线画单变量分布。我第一次用的时候非常震撼一行代码十几张子图自动生成。比如sns.pairplot(data[[消费金额, 购买次数, 会员等级]], hue会员等级)这个函数在处理小规模数据集时几乎是神兵利器它能快速暴露变量之间的线性相关性、簇状结构、分布形态。但要注意变量一多就爆炸。如果有十几个数值列pairplot会生成上百张子图图变小不说渲染还慢这时我更建议先用相关性矩阵heatmap做初筛sns.heatmap(data.corr(numeric_onlyTrue), annotTrue, cmapcoolwarm)heatmap不直接属于关系/分布/分类这三类但它是真正的“数据可视化之王”尤其是看相关矩阵。annotTrue把相关系数数字直接标在格子里cmap选一个发散型色带比如冷色到暖色一眼就能看出哪些变量正相关、哪些负相关哪些完全没有关系。jointplot有一点特殊它既可以画双变量分布也可以叠加回归或者散点。实际上jointplot是图级函数它会自动生成一个“主图两个坐标轴边缘分布图”的组合。比如你想深度探究消费金额和购买次数的联合分布可以这样sns.jointplot(datadata, x消费金额, y购买次数, kindhex)kindhex用六边形分箱展示密度比普通散点更耐看。jointplot本质上是一个独立的图级封装虽然在分类上我把它放在矩阵图里但它和pairplot的关系并不是子集关系而是一个关注“两变量联合”、一个关注“多变量两两组合”。5. 从函数分类角度避坑版本更替与数据格式5.1 老版本的distplot与kdeplot被整合别再用旧函数seaborn版本迭代带来的一个典型坑是老版本里的distplot函数在新的主流版本中已经废弃官方建议改用displot或histplot。如果你在搜索引擎上看到旧教程里面写着sns.distplot(x)在较新版本中的seaborn里运行会直接报错。我之前有一次帮同学排查代码看到报错信息里出现“distplotis a deprecated function and will be removed”对方还很疑惑说照教程写的怎么会错其实就是版本问题。正确的做法是把旧的画单变量分布需求转换到displot# 旧写法已废弃 # sns.distplot(data[消费金额]) # 新写法 sns.displot(data[消费金额])如果是想在已有Axes上画一条分布曲线就用histplot或kdeplot它们才是轴级函数。这个版本更替其实也印证了我前面讲的分类逻辑displot是图级入口histplot和kdeplot是它内部的轴级实现。你只要脑子里有“图级/轴级”这把尺子看到distplot被废弃也不会慌去找替代的函数名即可。5.2 长格式数据与宽格式数据请务必分清第二个常踩的坑是数据格式。seaborn的设计强烈偏向于使用长格式tidy data每一行是一个观测每一列是一个变量这样x、y、hue才能自由映射。但很多人用惯了pandas拿到的原始数据是宽格式比如每列是一个时间点行是不同的用户。直接把宽格式喂给seaborn经常画不出来或者画出的图完全不对。我处理宽格式数据的习惯是先用pd.melt()把它转成长格式。举个典型例子原来数据长这样用户ID一月二月三月A100150200B90110130要画每个用户在每个月的消费变化不能直接把整张表传给relplot需要先转换df_long df.melt(id_vars用户ID, var_name月份, value_name消费金额) sns.relplot(datadf_long, x月份, y消费金额, hue用户ID, kindline)转换完之后x、y、hue才各有所指。记住seaborn的所有分类函数前提都是数据处于长格式。只有heatmap可以直接吃宽格式的矩阵因为它本质上是把DataFrame的值按行列坐标染色。5.3 图级函数与轴级函数混用时的画布控制第三个坑是关于画布控制的。很多人用plt.subplots()建好画布之后又喊sns.displot(...)结果发现displot自己又开了一张图并不画在刚才的子图上。这是因为图级函数自带画布管理你外面建好的Axes根本传不进去。解决办法有两种第一种如果就是要用图级函数那就别手动创建画布直接在调用relplot、displot、catplot时通过参数控制行列数目。第二种如果想和其他图组合比如把散点图和箱线图放在同一个坐标系里就要切换到轴级函数去画。轴级函数有一个统一的ax参数可以接收Matplotlib的Axes对象。import matplotlib.pyplot as plt fig, axes plt.subplots(1, 2, figsize(12, 4)) sns.scatterplot(datadata, x消费金额, y购买次数, hue会员等级, axaxes[0]) sns.boxplot(datadata, x会员等级, y消费金额, axaxes[1]) plt.tight_layout()这个操作看起来简单但很多人会在这里卡住半天。本质原因就是没分清图级和轴级。scatterplot和boxplot都是轴级函数它们的责任是“在给定的坐标系上画内容”所以能把它们画进指定位置而scatterplot的图级大哥relplot没有ax参数它天然要自己管整张画布。6. 我自己的选型习惯用函数分类快速选图的方法6.1 一个简洁的决策流程函数分类不应该停留在概念上最好变成肌肉记忆。我给自己总结了一个用函数分类决定画图方法的决策流程每次拿到数据都会按这个思路走一遍第一步先判断分析目标。如果要看关系选关系图分类要看分布选分布图分类要对比类别选分类图分类要做回归诊断选回归图分类要一览全局选矩阵图分类。第二步在分类内部再判断要不要分面。需要分面就选图级函数relplot/displot/catplot不需要就可以直接用轴级函数。第三步根据数据样本量选择具体子图。比如分类图分类里数据量大选box或violin数据量小选swarm能展示更多细节。这个流程不复杂但极大减少了我“选择困难”的时间。遇到陌生数据集时我会先跑一个pairplot加一个heatmap做探索快速了解整体情况然后针对最关心的关系进入对应的分类用图级函数画带分面的大图最后如果有必要再回到轴级函数做微调。这套思路从函数分类来但已经超出了“函数名记忆”的范围变成一种分析框架。6.2 给初学者的练习顺序如果你刚开始用seaborn我不建议按函数字母表去背。更有效的做法是按分类做“最小案例练习”先试relplot(kindscatter)和relplot(kindline)理解关系图分类。再试displot(kindhist)、displot(kindkde)理解分布图分类。然后试catplot(kindbox)、catplot(kindviolin)、catplot(kindbar)理解分类图分类。最后用regplot和lmplot体会回归图用pairplot和heatmap体会矩阵图。每组案例都刻意加hue和col参数看看图级函数的分面能力。这样学下来你的掌握速度会比一个个函数零敲碎打快很多。因为你会发现同一个分类里的函数它们共享大量参数设计例如hue、col、row、palette在图级函数中几乎都是通用的轴级函数则普遍带有ax参数。一把尺子量到底这大概就是函数分类带来的最大红利。最后再分享一个我自己的小习惯电脑上常年开着seaborn的官方分类页面但一直不是用来查具体函数参数的而是用来确认某个图属于哪个分类。分类比函数名更稳定即便版本升级改了函数名分类层面的图型逻辑一般不会大变。当你发现自己不靠搜索也能凭分类推理出“这个场景应该能用displot去画”的时候seaborn在你的工具库里才算真正顺手了。