将本文结合代码使用效果更佳哦❤️❤️

速查

数据透视表创建.png

example gallery:

Seaborn 库简介

特点:

Seaborn, a statistical graphics library created by Michael Waskom. Seaborn simplifies creating many common visualization types.
Unlike when using matplotlib directly, it wasn’t necessary to specify attributes of the plot elements in terms of the color values or marker codes. Behind the scenes, seaborn handled the translation from values in the dataframe to arguments that matplotlib understands. This declarative approach lets you stay focused on the questions that you want to answer, rather than on the details of how to control matplotlib.
如果给的数据表符合规范(tidy),绘图使用会方便很多

Figure-level functions

seaborn 支持像 matplotlib 一样针对不同的绘图类型来调用不同的函数(ax-level),但是因为 seaborn 的代码本身是高度组织化(structured)的,更常用的是通过可视化任务的类型来调用 Figure-level 的接口函数去完成不同的可视化任务(重点不是图表类型),按照这个思路,seaborn 可以分为 distributions module、relation module 以及 category module 三个模块,每个模块都有一个figure-level的函数来帮助我们更快地完成可视化任务。
function_overview_8_0
Seaborn 绘图对于统计描述支持很少,只使用较为简单的函数便可以对数据做区间估计的可视化、分布的可视化等绘图,也会依据输入的数据来自己判断轴的名称等一系列内容(choose default values for its parameters based on characteristics of the data)
Figure-level 级别的绘图函数并不好用来绘制不同绘图类型的子图,虽然丧失了自定义程度,但是因为高度的统一性也变得更加简单易用,这是 seaborn 绘图的一大重要特色。
尽管如此,seaborn 的 figure-level 也通过返回的 seaborn 对象(一般是FaceGrid)的 ax 属性来支持对 matplotlib 的绘图对象的访问,这样就可以通过 seaborn 的绘图函数来完成一些简单的绘图任务,然后通过对返回的对象的处理可以实现一些自定义的凑在哦,这样就可以兼顾 seaborn 的简单易用性和 matplotlib 的灵活性:

tips = sns.load_dataset("tips")
g = sns.relplot(data=tips, x="total_bill", y="tip")
g.ax.axline(xy1=(10, 2), slope=.2, color="b", dashes=(5, 2))
g.set_axis_labels?

指定绘图尺寸

figure-level 在指定绘图尺寸时与 matplotlib 有一点区别:

  • 该函数使用heightaspect两个参数调整绘图尺寸,aspect参数是指定绘图的宽高比height参数是指定绘图的高度,aspectheight的乘积就是绘图的宽度。
  • 多副图的情况下,seaborn 的 figure-level 函数传入的参数规定的是每个子图的尺寸,而不是整个 figure 的尺寸
  • 一般可以在创建 seaborn 对象的时候进行指定

总结

On balance, the figure-level functions add some additional complexity that can make things more confusing for beginners, but their distinct features give them additional power. The tutorial documentation mostly uses the figure-level functions, because they produce slightly cleaner plots, and we generally recommend their use for most applications. The one situation where they are not a good choice is when you need to make a complex, standalone figure that composes multiple different plot kinds. At this point, it’s recommended to set up the figure using matplotlib directly and to fill in the individual components using axes-level functions.

两个特例

seaborn 的 figure-level 函数中还有两个特殊的函数不能直接划入上述所说的分类中,两个函数主要是用来描述变量之间的联合分布(jointplot())以及相关关系(pairplot()),之所以这两个函数被单列出来是因为两个函数建立了一种对数据的 multiple views,两个函数也会返回一个 seaborn 对象来帮助我们实现更多的自定义操作。
Seaborn库简介_20220930000031

jointplot

Seaborn库简介_20220930000107

pairplot
seaborn.jointplot(data=None, *, x=None, y=None, hue=None, kind='scatter', height=6, ratio=5, space=0.2, dropna=False, xlim=None, ylim=None, color=None, palette=None, hue_order=None, hue_norm=None, marginal_ticks=False, joint_kws=None, marginal_kws=None, **kwargs)
seaborn.pairplot(data, *, hue=None, hue_order=None, palette=None, vars=None, x_vars=None, y_vars=None, kind='scatter', diag_kind='auto', markers=None, height=2.5, aspect=1, corner=False, dropna=False, plot_kws=None, diag_kws=None, grid_kws=None, size=None)

Axes-level functions

seaborn 的轴级函数与 matplotlib 比较相似,在创建好轴之后可以通过ax=参数来调整绘图的位置:

f, axs = plt.subplots(1, 2, figsize=(8, 4), gridspec_kw=dict(width_ratios=[4, 3]))
sns.scatterplot(data=penguins, x="flipper_length_mm", y="bill_length_mm", hue="species", ax=axs[0])
sns.histplot(data=penguins, x="species", hue="species", shrink=.8, alpha=.8, legend=False, ax=axs[1])
f.tight_layout()

轴上每一个位置都是一副独立的子图,这一定程度也满足了我们自定义绘图的要求。

Figure-level 函数作为 seaborn 的一大特色,是在学习过程中应着重加以关注的

统计分析-replot

Visualizing statistical relationships
sns 的replot主要是用来进行统计分析的一个函数,主要调用的是scatterplotlineplot两个 axes-level 函数,可以用来分析变量之间的关系

sns.relplot(
data=None,
x=,
y=,
kind='scatter',
col=,
hue=,
style=,
size=,
col_wrap=,
)

参数示意:
这些参数都可以传入 data 的列名,以列为依据进行操作

  • kind: {‘line’, ‘scatter’}, optional
  • col: 拆分数据集,用来创建不同的子图
  • hue: 色彩语义(hue semantic),用来确样本点的取色依据(不同值会有不同的颜色),若该列的值为连续值,默认使用渐变颜色
  • style: 样式语义(style semantic),用来确定样本点的标记格式(例如圆或者*等)
  • size: 尺寸语义(size semantic),用来确定样本点的标记大小
  • col_wrap: int,每一行子图个数
    对于绘图的具体用哪些颜色或者标记点的类型等自定义化的功能,则需要根据使用的 ax-level 函数的传入参数来进行调整(例如查看 scatterplot 函数的参数说明),上边提到的参数只能用来确定用作分类依据的列。
    这里给出一个 scatterplot 的例子:
#Load an example dataset
tips = sns.load_dataset("tips")
#Create a visualization
sns.relplot(
data=tips,
x="total_bill",
y="tip",
row=,
col="time",
hue="smoker",
#palette="ch:r=-.5,l=.75",#自定义化颜色
style="sex",
size="size",
#sizes=(15, 200),#自定义数据点大小
)

Seaborn库简介_20220930221048
由于线形图有区间估计等更加复杂的操作,因此当指定kind='line'时,会有一些其它特殊的参数,这里做一个简单说明:

sns.relplot(
data=fmri,
kind="line",
x="timepoint",
y="signal",
estimator=None,
errorbar="sd",
units=,
sort=True
orient="x",
)

对于lineplot函数,seaborn 会根据输入的数据特征做一些默认的处理,例如对于同一个 x 有多个不同的观测值的情况,该函数会在默认情况下自动将数据聚集起来(aggregate,可以指定estimator=None取消),然后对样本做一个 95%的置信区间估计(可以调整errorbar参数选择不估计或者改为其他的估计方式)。units相当于一个分组键,会将分组后的数据呈现在一图中(不显示图例)。
sort 表示对数据是否排序,orient 表示索引轴(默认 x
一个例子:

fmri=sns.load_dataset("fmri")
sns.relplot(
data=fmri, kind="line",
x="timepoint", y="signal", hue="region", style="event",
dashes=False,
markers=True,
)
sns.relplot(
data=fmri.query("region == 'frontal'"), kind="line",
x="timepoint", y="signal", hue="event", style="event",
col="subject", col_wrap=5,
height=3, aspect=.75, linewidth=2.5,
)

更加细致的自定义程度还得参考lineplot函数的参数说明。

数据分布可视化

displot函数主要是对数据的分布情况进行可视化,样式的定义参数与前边提到的relplot函数类似,数据分布的可视化可以分为单变量数据分布可视化和两变量数据可视化,这个主要根据传入函数的x,y来确定,绘图种类有直方图、核密度估计图、ecdf 三种类型的图,都是对数据分布情况的可视化,这里只对常用的条形图的可视化参数做一个说明,其余两种类型的绘图方式见官方文档(绘图函数差别较大,很多细节的调整要查看对应的绘图函数)

sns.displot(data, x="类型"
, hue='纹饰'
# , fill=True
#,shrink=.5
#,bins=4
, multiple="stack"
,rug=False
)
  • shrink:条形图的宽度,取值范围[0,1],默认为 1,取值越小,条形图越窄
  • bins:划分区间个数,也可以传入数字列表表示划分位置
  • multiple:调整多个条形图的布局方式,取值为stack或者dodge,默认为stack,即堆叠,取值为dodge时,条形图会分开显示
  • rug:边缘分布情况

Seaborn库简介_数据分布可视化displot()

联合分布和边缘分布可视化

seaborn 的jointplot()函数提供了绘制二维数据的联合分布的绘图方法,通过调整kind参数能实现对二维数据选择各种绘图类型进行绘制,另外改图也会在联合图的正上方和右边绘制单变量的分布图,也支持对绘图方法进行自定义:

penguins = sns.load_dataset("penguins")
g = sns.JointGrid(data=penguins, x="bill_length_mm", y="bill_depth_mm")
g.plot_joint(sns.histplot)
g.plot_marginals(sns.boxplot)

多变量分布可视化

pairplot函数提供与jointplot相似的功能但是支持多变量的数据分布可视化。
pairplot()函数支持定义对角线上边和下边使用不同的绘图方法,可以通过调整参数决定不同子图是否共享 xy 轴,具体可以查看官方文档

penguins = sns.load_dataset("penguins")
g = sns.PairGrid(penguins)
g.map_upper(sns.histplot)
g.map_lower(sns.kdeplot, fill=True)
g.map_diag(sns.histplot, kde=True)

多子图自定义

从上述pairplotjointplot的绘图方式可以看出 seaborn 也提供了比较灵活的绘图方式,大致步骤是首先先创建一个FaceGrid对象,然后在该对象上调用map()方法,该方法接收一个绘图函数和一个或多个列名,然后在每个子图上调用该绘图函数,绘制对应的图形。FacetGrid对象的map()方法还支持传入hue参数,用于指定绘图时使用的颜色变量,FacetGrid对象的add_legend()方法可以在图形中添加图例。更多细节可以查看官方的帮助文档

import numpy as np
import pandas as pd
import seaborn as sns

sns.set_theme()

# Generate an example radial datast
r = np.linspace(0, 10, num=100)
df = pd.DataFrame({'r': r, 'slow': r, 'medium': 2 * r, 'fast': 4 * r})

# Convert the dataframe to long-form or "tidy" format
df = pd.melt(df, id_vars=['r'], var_name='speed', value_name='theta')

# Set up a grid of axes with a polar projection
g = sns.FacetGrid(df, col="speed", hue="speed",
subplot_kws=dict(projection='polar'), height=4.5,
sharex=False, sharey=False, despine=False)

# Draw a scatterplot onto each axes in the grid
g.map(sns.scatterplot, "theta", "r")

axes方法:

import matplotlib.pyplot as plt
f, axs = plt.subplots(1,
2,
figsize=(8, 4),
gridspec_kw=dict(width_ratios=[4, 3]))
sns.scatterplot(data=penguins,
x="flipper_length_mm",
y="bill_length_mm",
hue="species",
ax=axs[0])
sns.histplot(data=penguins,
x="species",
hue="species",
shrink=.8,
alpha=.8,
legend=False,
ax=axs[1])
f.tight_layout()

分类变量可视化

catplot函数主要是对分类变量的可视化,其绘图类型有stripplotswarmplotboxplotviolinplotboxenplotpointplotbarplotcountplot.
Seaborn库简介_catplot
绘制不同图时只需调整kind参数即可,其余参数与前边类似,具体的细节调整要查看对应的绘图函数来进行调整
感觉点图绘制的很新奇,有一点像桑葚图的感觉
Seaborn库简介_20221001210625

titanic=sns.load_dataset('titanic')
g = sns.catplot(
data=titanic, x="class", y="survived", hue="sex",
palette={"male": "g", "female": "m"},
markers=["^", "o"], linestyles=["-", "--"],
kind="point"
)
g.savefig('./sns样图/分类点图.png')

customization

Seaborn is so nice to make a beautiful plot, but sometimes we need to customize the plot to make it more beautiful. Here are some tips to customize the plot. Just remember that you can always check the documentation of the function you are using to see what parameters you can use to customize the plot. If this is not enough, may be consider the return object of the function you are using and use the methods of the object to customize the plot(diffent functions return different object, but most of time you can find a way to customize the plot using like the ax object in matplotlib), FaceGrid object is a unique object in seaborn, but you can also its ax attribute to customize the plot.

seaborn.objects

seaborn.objects是 seaborn 在 v0.12 中推出的一种全新的绘图方式,借鉴 ggplot2 的思想,使用全新的 end-to-end 的链式调用法绘图,使得 seaborn 的可扩展性和自定义化程度大大提高,因为目前这个版本还是一个实验性的版本,因此这里只介绍一下这种思想,简单的代码实践可以参考代码实践

seaborn.objects中,一般的使用步骤如下

  1. 首先实例化一个Plot对象,该对象可用的方法:
    Seaborn库简介_20230109145916

  2. 然后调用该对象的add()方法来创建一个个 layer,同时也支持通过调用facet()方法来创建多个子图。

class Plot.add(mark, *transforms, orient=None, legend=True, data=None, **variables)
  • 在每一个 layer 中,可以传入想要的绘图方式so.Mark类(so.Dot(),so.Line(),so.Area(),so.Bar())来绘制想要的图形,与最初的绘图方法不同的是 seaborn.objects 会对有的绘图方式提供两种方法。以so.Bar()so.Bars(),后者常用于 x 变量是连续变量的情况,相当于专门对这种情况做了一些优化(The plural version is typically optimized for cases with larger numbers of marks.)
    注意对于复杂的图形,可能会多次调用 add 方法来实现更加复杂的操作(Plot方法也是同理),比如先做出散点图,然后在对点进行拟合,这种叠加的效果其实也就显现出来了这种接口方式的一个优势。

    An important thing to know is that Plot methods clone the object they are called on and return that clone instead of updating the object in place.

The Plot methods are fully declarative. Calling them updates the plot spec, but it doesn’t actually do any plotting. One consequence of this is that methods can be called in any order, and many of them can be called multiple times.

然后可以选择传入so.Stat类对原始数据进行聚合操作或者传入so.Move类对绘图对象进行平移,二者都会被传入transforms参数,二类都有时有限传入Stat
so.Stat类:

  • so.Agg(): 需要在开始传入 x 和 y 变量,默认使用均值函数对每一组的取值(具体选择是自动决定的)进行聚合(因为涉及到分组所以一般用在类别变量+数值变量的情况)
  • so.Hist():只需在开始时传入一个变量,另外一个变量取值通过该方法的函数进行计算
  • so.Est():同时对 x 和 y 进行转换(Some transforms accept both x and y, but add interval data for each coordinate. This is particularly relevant for plotting error bars after aggregating)
    这些方法都只是聚合数据的方法

so.Move()类:
so.Move()类对绘图的对象进行移动(so.Dodge(), so.Jitter()
另外也可以传入定义在这个 layer 上的参数(是否显示图例,按照哪一列进行分类,orient 参数等)。

需要强调的是so为色彩语义添加了更加详细的划分(引入了edgecolor参数)因此原来绘图中使用的hue也就被替换成了color,从这点也可以看出在引入这个接口之后 seaborn 的自定义化程度更高了。
注意这种绘图方式下的三个不同的定义空间

  • 定义在所有 layer 中的参数
  • 定义在一个 layer 中的参数
  • 定义在绘图函数中的参数(map data values to various graphical properties)

Seaborn库简介_20221004130250
对于图形在 notebook 中的显示,官方是这么写的:“To see a plot in a notebook, either return it from the final line of a cell or call Jupyter’s built-in display function on the object. The notebook integration bypasses matplotlib.pyplot entirely, but you can use its figure-display machinery in other contexts by calling Plot.show().”
最后是so.save对绘图进行保存

import seaborn.objects as so
(
so.Plot(data=None,
x=None,
y=None,
color=None,
edgecolor=None,
marker=None,
xmin=None,
fill=None,
groups=None)
.facet(col=None,
row=None,
)
.add()
)

外观调整

调用该对象的scalelabel()等方法来设置颜色、坐标轴、图例、marker 等图形外观属性:

  • scale():设置坐标轴的范围间隔等内容(对数刻度,也可以修改所有图层的颜色,更多的查看帮助文档
(
so.Plot(diamonds, x="carat", y="price", color="clarity", pointsize="carat")
.add(so.Dots())
.scale(color=("#88c", "#555"), pointsize=(2, 10))
)

Customizing limits, labels, and titles

  • label():Control the labels and titles for axes, legends, and subplots.
  • limit:坐标轴范围设置
  • share:是否共享坐标轴
(
so.Plot(diamonds, x="carat", y="price", color="carat")
.add(so.Dots())
.scale(
x=so.Continuous().tick(every=0.5), #x轴刻度间隔设置为0.5
y=so.Continuous().label(like="${x:.0f}"),#y轴刻度格式设置
color=so.Continuous().tick(at=[1, 2, 3, 4]),
)
)

如果想要同时指定标签和刻度,可以写成类似so.Continuous().tick(every=1).label(like="{x: .0f}")的形式

(
so.Plot(penguins, x="body_mass_g", y="species", color="island")
.facet(col="sex")
.add(so.Dot(), so.Jitter(.5))
.share(x=True) #x轴是否使用同一刻度
.limit(y=(2.5, -.5)) #y轴范围设置
.label(
x="Body mass (g)", y="",
color=str.capitalize,
title="{} penguins".format,
) #label个性化标题
)

An important thing to know is that Plot methods clone the object they are called on and return that clone instead of updating the object in place.

Theme customization

theme():调节绘图参数,可以用来设置图片中文显示之类的(更新 Rc 参数)
截止到目前seaborn.object都没有全局状态的概念,这也意味着sns.set_theme()并不会对seaborn.objects的绘图功能起到作用
Seaborn库简介_20230109153031

多子图创建

简单来说seaborn.object接口的出现方便了 sns 的多子图绘制功能。

seaborn.objects为 seaborn 中多子图的绘制提供了更加方便的方法。一般来说,我们希望的多子图分为两种情况:

  • 一种情况是观察不同类别的特征差异,这种情况下我们希望不同子图的数据是某一列的不同取值,这时可以调用facet()方法
  • 另外一种情况是希望比较个体不同特征的差异,这个时候不同子图的绘图变量不同,这时则可以使用pair方法,类似PairGrid()
    多子图方法相当于对在 figure 层面进行操作,因此一般先于add()方法调用。
    facet()方法可以指定绘图的行列数,以及绘图的顺序,这样就可以很好地解决多子图绘制没有那么方便的问题,若在绘制时传入类似.facet(row='col_var')参数,那么就可以快速实现多子图的创建,若直接在Plot()中指定color参数,就会默认绘制在一张图之上。大概差异可以看下边的图:
    Seaborn库简介_20221015123743
    只指定color参数:
    Seaborn库简介_20221015123658
    具体的绘图代码见代码

结合 matplotlib

严格来说有了pair,facet方法后使用 seaborn 进行完整绘图已经不存在什么问题。开发者考虑到可能会有 seaborn 不能覆盖的情况,通过Plot().on()方法将 matplotlib 进行融合,该方法可以传入的参数是一个绘图位置的对象(This object can be either a matplotlib.axes.Axes, matplotlib.figure.Figure, or matplotlib.figure.SubFigure; the latter is most useful for constructing bespoke subplot layouts),记得在最后边调用一下.plot()方法让图片显示出来