Seaborn的使用
Seaborn是一个基于matplotlib的Python数据可视化库,并且与pandas的数据结构进行紧密整合。它提供了一个高级的界面来绘制有吸引力的和信息丰富的统计图形。
- Seaborn推荐在Jupyter/IPython环境下使用,因为是它的绘图是基于matplotlib的,所以其他环境下需要调用matplotlib.pyplot.show()来显示图像
- Seaborn是一个纯Python库,所以通常安装不会出现问题
1 支持的数据格式
本节参考自Seaborn支持的数据格式
Seaborn接受以表格形式组织的多个向量的数据集,这种数据集一般可分为长格式和宽格式两种情况
长格式(以
flights
数据集为例)
- 长格式数据集每一列是一个变量,每个样本对应一行
flights = sns.load_dataset("flights")
flights.head()
- 长格式数据的优点是只要变量和观测值定义明确,它可以容纳任意复杂度的数据集,适合明确的图表说明,但复杂较高的时候不容易理解。
长格式数据绘图代码示例如下:
sns.relplot(data=flights, x="year", y="passengers",
hue="month", kind="line")
宽格式
- 宽格式数据集的列和行一般对应不同维度,并且包含维度的变量级别
flights_wide = flights.pivot(index="year",
columns="month", values="passengers")
flights_wide.head()
- 当数据集通过“pivot”操作将其从长格式转换为宽格式时,关于值的含义的信息就丢失了
- 长格式数据可以通过名称访问数据集中的变量。而对于宽格式数据,表的不同维度和具体数据直接存在明确的关联。
宽格式数据绘图代码示例如下:
sns.relplot(data=flights_wide, kind="line")
长格式VS宽格式
- 宽格式数据最多表示三个维度的信息
- seaborn默认宽格式数据集中的列变量是分类的,而不管它的数据类型
- 格式正确的宽格式数据可以直接绘制图像,不需要参数指定,代码量少
- 长格式数据通过参数的指定,可以实现更丰富的图像类型
2 导入包
常见的两种安装方式
pip install seaborn #pip包管理器
conda install seaborn #conda包管理器
Seaborn的依赖性
- python3.6+
- 包依赖:numpy、scipy、pandas、matplotlib
- 可选包依赖:statsmodels(用于回归模型绘图)、fastclutser(用于聚类模型的评估)
Seaborn的导入方法如下:
# Import seaborn
import seaborn as sns
- sns是习惯性叫法,常作为Seaborn的简写表述方式
3 设置主题与风格
其中
# Apply the default theme
sns.set_theme()
- Seaborn的主题设置主要通过封装<code>matplotlib rcParam system</code>来实现的
- seaborn共有五种常见的主题
darkgrid
,whitegrid
,dark
,white
,以及ticks
- 其中
darkgrid
是默认主题风格,不过对于比较复杂的图像来说,网格(grid
)是不必要的,这时可以考虑后三个主题 white
以及ticks
默认会增加绘图的上边框和右边框,可通过sns.despine()
去除,函数sns.despine()
还可以用于坐标轴的其他设置- 通过
with sns.axes_style()
语法,可以实现局部风格的切换 - 通过
sns.axes_style()
可以对主题的部分风格进行覆盖,实现更灵活丰富的样式 - 通过
sns.set_context
可以进行文本风格的设置,内置了paper
,notebook
,talk
和poster
四种文本风格,默认为notebook
,poster
风格最为显著(粗大)。
4 导入数据集
# Load an example dataset
flights = sns.load_dataset("flights")
- 通过
load_dataset
方法导入的数据集都是pandas中的Dataframe结构
Seaborn支持几种不同的数据集格式
5 调色板
计算机一般通过RGB值设置了红色、绿色和蓝色通道的强度,并以此构成最终的颜色。
但要分析颜色的感知属性,最好考虑色调、饱和度和亮度通道等特性。
亮度的变化让人更容易感知到值之间的距离
使用调色板最重要的函数是color_palette()
调色板分类
- 定性(qualitative)调色板,用于表示分类数据
- 顺序(sequential)调色板,很适合表示数字数据
- 分散(diverging)调色板,适合用分类边界表示数字数据
5.1 定性调色板
- 默认的调色板有十个不同颜色
- 定性调色板一般包括deep, muted, pastel, bright, dark 和 colorblind六种变体
- 通常情况下seaborn会在色彩空间中寻找均匀间隔的颜色作为调色板基本色,常见的色彩空间包括
hls
和husl
,设置方法为sns.color_palette("hls", 8)
- seaborn还可以选择已定制好的调色板(一般比较好看)
常见的两种已分类调色板:
sns.color_palette("Set2")
2. sns.color_palette("Paired")
5.2 顺序调色板
当数据范围从相对较低或无趣值到相对较高或感兴趣值(或反之)时,顺序调色板是合适的
seaborn内置了四种常用的顺序调色板rocket
, mako
, flare
, and crest
sns.color_palette("rocket", as_cmap=True)
- 当
as_cmap=False
将输出分类调色板
还可以进行更复杂灵活的调色板定制
sns.cubehelix_palette(start=2, rot=0, dark=0, light=.95, reverse=True, as_cmap=True)
5.3 发散调色板
发散调色板适用于存在低值或高值的数据,并且常通过亮度和饱和度强调的中点值(通常是0)
sns.color_palette("icefire", as_cmap=True)
也可以进行更灵活丰富的定制
sns.diverging_palette(250, 30, l=65, center="dark", as_cmap=True)
Seaborn的绘图
1 Seaborn的绘图概述
本小节参考自Seaborn绘图函数概述
1.1 绘图函数的模块化(水平结构)
- Seaborn包的命名空间是扁平的
- 所有的功能都可以在顶层访问,即
sns.function
- 但是代码本身是存在分层结构的
- 不同绘图函数会根据相似的可视化目的划分到同一个模块中
- 常见的几个绘图模块包括:关联(
relational
)模块、分布(distributional
)模块、分类(categorical
)模块 - 模块中的函数共享大量底层代码,并包含一些特殊的参数(如
multiple="stack"
)方便同一个数据格式进行不同角度绘图的快速实现
1.2 图形级VS轴级(垂直结构)
- 图形级函数通过管理图形的seaborn对象(通常是<code>FacetGrid</code>)与matplotlib进行对接
- 每个模块都有一个图形级函数,它为各种轴级函数提供了一个统一的接口
- 比如,图形级函数
displot
就包括四个轴级函数,当调用函数displot
时,会默认绘制直方图(也就是调用函数histplot
函数),而如果需要调用其他三个轴级函数,可以通过参数kind
指定 - 示例如下
penguins = sns.load_dataset("penguins")
sns.displot(data=penguins, x="flipper_length_mm", hue="species", multiple="stack")
sns.displot(data=penguins, x="flipper_length_mm", hue="species", multiple="stack", kind="kde")
1.2.1 图形级函数创建多子图
图形级函数提供的最有用的功能是可以轻松地创建带有多个子图的图形
sns.displot(data=penguins, x="flipper_length_mm", hue="species", col="species")
- 图形级函数包装许多同模块下的轴级对应函数
- 特定类型的关键字参数(例如柱状图的
bin
)传递到底层函数。 - 图形级函数的灵活性没有降低,但也有一个缺点:特定类型的参数有可能藏在对应轴级函数的说明中,有时容易被忽略。
1.2.2 轴级函数与matplotlib函数的等效性
编写轴级函数的目的是充当matplotlib函数的临时替换
轴级函数会自动添加轴标签和图例,但它们不会修改绘制轴以外的任何内容。这意味着它们可以被组合成任意复杂的matplotlib图形,并具有可预测的结果。
轴级函数会在内部调用 matplotlib.pyplot.gca(),该函数挂钩到matplotlib的状态接口,以便它们在“当前活跃的”轴上绘制绘图。但它们还接受一个
ax
参数,用于实现与matplotlib绘图位置的精准对接:
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()
1.2.3 图形级函数的增强
图形级函数“拥有”自己的初始化方式和图形,所以不能像轴级函数一样直接兼容matplotlib函数的绘图。但是通过访问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))
1.2.4 图形级函数的特有功能
图形级函数返回一个<code>FacetGrid</code>实例,该实例具有一些独特方法,用于更便捷地子图绘制的组织和绘图属性的定制。例如,您可以使用一行代码更改外部轴上的标签:
g = sns.relplot(data=penguins, x="flipper_length_mm", y="bill_length_mm", col="sex")
g.set_axis_labels("Flipper length (mm)", "Bill length (mm)")
- 这些独特方法是图形级函数独有的,不属于matplotlib API
1.2.5 指定图片尺寸
- 对于轴级图片来说,matplotlib指定尺寸方式是适用的(比如说通过<code>global rcParams</code>进行全局配置,或者设置matplotlib.pyplot.subplots()中的
figsize
参数进行调整) - 对于图形级图片来说,其函数本身具有特有的指定图片尺寸的参数(主要来自 <code>FacetGrid</code>对象)
- matplotlib常用的参数为
width
和height
,而图形级函数常用的参数为heigth
和aspect
(width
=height
*apsect
) - 图形级函数的参数主要用于指定子图的尺寸,而不是整个图像的大小
1.2.6 图形级函数的优缺点总结
优点 | 缺点 | |
---|---|---|
方便多角度刻画数据 | 参数过多,且说明不全面 | |
有默认的图例 | 图像不能很好地兼容matplotlib | |
轻松定制为轴级图像 | 和matplotlib参数不一致 | |
不同指定图片尺寸方法 | 不同指定图片尺寸方法 |
1.3 数据可视化的复合视角
- 不是所有函数都满足以上的水平结构或垂直结构
- jointplot()和 pairplot()作为两个图形级函数,会使用来自不同模块的多种图来在单个图中表示数据集的多个方面
- 但是它们使用不同的对象来管理图形:分别是<code>JointGrid</code> 和 <code>PairGrid</code>
1.3.1 jointplot()
jointplot()
用于绘制两个变量的关联关系或联合分布,同时在边际轴位置显示每个变量的单变量分布情况:
sns.jointplot(data=penguins, x="flipper_length_mm", y="bill_length_mm", hue="species")
- 这些绘图函数的背后依然是一些基础的轴级函数
- 比如上图描述关联关系用的是
scatterplot()
,而描述边缘的单变量分布用的是kdeploy()
- 可以通过
kind
参数指定其他的轴级函数来组成新的可视化视角
1.3.2 pairplot()
pairplot()
也采用了相似的关联和边缘的思路,但不是专注于单个关系的展示,而是将变量进行两两组合,同时进行可视化探究他们的关系:
sns.pairplot(data=penguins, hue="species")
2 关联图
- 统计分析是一个理解数据集中的变量关联关系和依赖关系的过程
- 关联图主要采用图形级函数
relplot()
,并通过参数kind
实现两个常用的轴级函数:散点图(scatterplot()
)和线图(lineplot()
) - 这两种图像一般描述的是二维数据,但可以通过设置色彩、大小和形状,实现额外三个维度的信息的表达
- 代码部分准备工作如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="darkgrid")
本小节内容主要参考自关联图入门
2.1 散点图
- 散点图是统计可视化的主要方法,使用点云描述了两个变量的联合分布
- 其中每个点代表数据集中的一个观察。这种描述保留了大量的数据原始信息。
最常见的情况是两个数值型变量,其可视化效果如下:
tips = sns.load_dataset("tips")
sns.relplot(x="total_bill", y="tip", data=tips);
通过设置颜色、形状引入额外的信息
sns.relplot(x="total_bill", y="tip", hue="smoker", style="smoker",
data=tips);
- 颜色和形状通常会让对比更显而易见
- 但注意有时也会引入过于复杂的变化,降低可读性
- 颜色在面对数值型变量时,会转为渐变色的效果
使用调色板定制颜色
sns.relplot(x="total_bill", y="tip", hue="size", palette="ch:r=-.5,l=.75", data=tips);
!
更多参数和示例可参考 scatterplot()
2.2 线图
对于一些数据集,如果变量是随着时间变化的函数,或类似的连续变量。在这种情况下,画一个线图会是一个不错的选择
df = pd.DataFrame(dict(time=np.arange(500),
value=np.random.randn(500).cumsum()))
g = sns.relplot(x="time", y="value", kind="line", data=df)
g.figure.autofmt_xdate()
默认情况下,线图会先根据x值进行样本排序,然后绘制,这一过程可以通过设置参数sort=False
取消:
df = pd.DataFrame(np.random.randn(500, 2).cumsum(axis=0), columns=["x", "y"])
sns.relplot(x="x", y="y", sort=False, kind="line", data=df);
数据聚合和不确定性度量
- 更复杂的数据集中相同的x变量可以对应多个测量值
- 此时seaborn的默认行为是绘制均值和95%置信区间来聚合数据
fmri = sns.load_dataset("fmri")
sns.relplot(x="timepoint", y="signal", kind="line", data=fmri);
- 可以通过参数
ci=None
取消置信区间的显示 - 置信区间默认是使用自助法计算的,在数据量大时计算成本偏高
- 可以通过参数
ci="sd"
设置计算方式为标准差,计算成本低
线图也有和散点图相似的格式设置:色彩、线宽、形状
线图还非常适合用于时序数据的可视化
2.3 分面网格关联图
- 几个简单的图往往比一个复杂的图更有效
- 网格关联图常用于探究两变量的关联关系与其他变量的依赖性
sns.relplot(x="timepoint", y="signal", hue="subject",
col="region", row="event", height=3,
kind="line", estimator=None, data=fmri);
- 对于类别型变量,还可以分类别作子图
- 观察不同类别下的变量关联关系和依赖关系
sns.relplot(x="timepoint", y="signal", hue="event", style="event",
col="subject", col_wrap=5,
height=3, aspect=.75, linewidth=2.5,
kind="line", data=fmri.query("region == 'frontal'"));
更多参数和示例可参考 lineplot()
3 分布图
分布图指专门用于描述数据点分布的绘图,并着重于解决以下几个问题
- 观测范围是什么?
- 数据的中心趋势是什么?
- 数据是否严重的偏斜?
- 数据是否存在双峰性?
- 是否存在显著的异常值?
- 通过其他变量筛选子集后,这些问题的答案是否发生改变?
分布图主要采用图形级函数displot()
,并涵盖了四个轴级函数:直方图绘制histplot()
、核密度图kdeplot()
、经验累积分布图ecdfplot()
、边际分布图rugplot()
,除此之外,这些轴级函数还可以组成另外两种图形级函数jointplot()
和pairplot()
本小节内容主要参考自分布图入门
3.1 直方图
通过取值范围,将数据划分到间隔相同的方柱中,方柱的高度表示此区间内的样本数量
penguins = sns.load_dataset("penguins")
sns.displot(penguins, x="flipper_length_mm", binwidth=3)
- 可以通过参数
binwidth
选择方柱的间隔 - 可以通过参数
bins
选择方柱的数量 - 参数
bins
可以输入数组,用于指定每个间隔点 - 对于离散型数据,可以通过
discrete=True
,统计每种取值的样本数量 - 可以通过参数
shrink
调整方柱间的距离
3.1.1 条件分布下的直方图
sns.displot(penguins, x="flipper_length_mm", hue="species")
- 可以通过参数
element="step"
指定为阶梯直方图,能更直观地看到各个子集的分布情况 - 可以通过参数
multiple="stack"
指定为堆叠直方图,能更直观地看到每个方柱的组成情况 - 可以通过参数
multiple="dodge"
指定为并列直方图,方便对比各个子集在不同方柱之间的情况
3.1.2 分面网格直方图
sns.displot(penguins, x="flipper_length_mm", col="sex")
3.1.3 直方图的标准化
sns.displot(penguins, x="flipper_length_mm", hue="species", stat="density", common_norm=False)
- 参数
stat="density"
表示对计数进行规范化 - 参数
common_norm=False
则限制规范化在每个子集内进行 - 也可以通过
stat="probability"
进行规划化,采用了概率的方式,最终绘图总面积和为1
3.2 核密度图
随着直方图的bins
增大,直方图的轮廓将逐渐逼近样本的概率密度函数
而通过诸如高斯核平滑等方法,可以得到连续的概率密度估计的图像,也就是核密度(Kernel density estimation,可简称KDE)图
sns.displot(penguins, x="flipper_length_mm", kind="kde", bw_adjust=.25)
- 参数
bw_adjust
用来控制核密度图的平滑程度 - 过高的
bw_adjust
可能会抹去有意义的特征 - 过低的
bw_adjust
可能会导致图像充斥着过多的随机噪声
3.2.1 条件分布下的核密度图
sns.displot(penguins, x="flipper_length_mm", hue="species", kind="kde", fill=True)
- 参数
fill=True
会对曲线内部颜色进行填充 - 参数
multiple="stack"
可以修改核密度图为分层模式
3.2.2 核密度图的有缺点分析
优点
- 数据的重要特征很容易识别(集中趋势、双模态、偏态)
- 方便子集之间的简单比较
缺点
- 由于平滑的原因,可以超出样本数据区间限制,可以通过参数
cut=0
修复- 对于比较离散的数据,平滑会在两个离散值之间进行填补,导致分布失真
diamonds = sns.load_dataset("diamonds")
sns.displot(diamonds, x="carat", kde=True)
3.3 经验累积分布图
经验累积分布(empirical cumulative distribution function,后简称ECDF)图的横轴表示数据范围,纵轴表示百分位数
sns.displot(penguins, x="flipper_length_mm", kind="ecdf")
- ECDF图直接表示每个数据点,不需要考虑容器大小或平滑参数
- 由于曲线是单调递增的,ECDF图非常适合于多种分布的比较
- 类似于直方图和核密度图,ECDF图可以通过参数
hue
进行条件分布的对比 - 但是ECDF图不能直观的展现数据的分布情况,但可以通过斜率进行间接分析
3.4 分布的其他可视化
3.4.1 二元直方图
sns.displot(penguins, x="bill_length_mm", y="bill_depth_mm", binwidth=(2, .5), cbar=True)
- 二元直方图将数据存储在矩形内,每个矩形内的观察计数用颜色表示
- 可以通过参数
binwidth
分别指定两个维度的间隔 - 可以通过参数
cbar=True
添加计数和颜色的映射说明 - 二元直方图可以绘制离散型二元数据的分布情况
- 当二元数据为一维离散,一维连续时,可通过参数
log_scale=(True, False)
进行调整
3.4.2 二元核密度图
sns.displot(penguins, x="bill_length_mm", y="bill_depth_mm", hue="species", kind="kde")
- 二元KDE图的等值线方法更适合评估子集分布的重叠情况
- 过多的等值线可能会导致图像的混乱
- 过少的等值线可能会忽略部分图像的特征
- 等高线的间隔可以通过参数
thresh
指定 - 等高线的数量可以通过参数
levels
指定,参数levels
也接受数组用于分别指定每个间隔点
3.4.3 jointplot()绘图
sns.jointplot(
data=penguins,
x="bill_length_mm", y="bill_depth_mm", hue="species",
kind="kde"
)
- jointplot()常用于描述二元关系或分布图,并包含两个变量的边际分布图
- jointplot()的默认二元分布图为散点图,默认边际分布图为直方图
- 通过参数
kind="kde"
可以修改jointplot()的绘图组成为核密度图 - 通过参数
rug=True
可以修改jointplot()的边际分布图为rug图
通过建立<code>JointGrid</code>实例,能实现更灵活的jointplot
绘图
g = sns.JointGrid(data=penguins, x="bill_length_mm", y="bill_depth_mm")
g.plot_joint(sns.histplot)
g.plot_marginals(sns.boxplot)
3.4.4 pariplot()绘图
pariplot()通过可视化的方法,展示数据集中所有变量的单变量分布以及它们的成对联合分布
sns.pairplot(penguins)
通过建立<code>PairGrid</code>实例,能实现更灵活的pairplot
绘图
g = sns.PairGrid(penguins)
g.map_upper(sns.histplot)
g.map_lower(sns.kdeplot, fill=True)
g.map_diag(sns.histplot, kde=True)
4 分类图
关联图和分布图能够很好的展示数据的分布情况和数据间的关联性
当其中一个关键变量是类别型时,或许有更好的方法进行可视化
和关联图、分布图一样,分类图同样也有一个图形级函数catplot()
,并且封装了更丰富的轴级函数,主要可以分为以下三类:
- 带分类的散点图:stripplot()和swarmplot()
- 带分类的分布图:boxplot()、violinplot()和boxenplot()
- 带分类的关联图:pointplot()、barplot()和countplot()
本小节内容主要参考自分类图入门
4.1 带分类的散点图
4.1.1 strip带状散点图
tips = sns.load_dataset("tips")
sns.catplot(x="day", y="total_bill", data=tips)
- 可以通过参数
jitter
约束带状散点图的抖动 - 当数据量较多时,带状散点图可能会不太直观(点过于密集)
4.1.2 swarm蜂群状散点图
sns.catplot(x="day", y="total_bill", kind="swarm", data=tips)
- 采用类似“蜂群”的方式排列样本,避免重叠
- 只适用于样本较少的情况
- 当样本范围较大时,可以通过交换x,y,实现图像的转置
4.2 带分类的分布图
当数据集规模过大时,分类散点图所能提供的信息变得冗杂而有限。
这时需要新的绘图方法总结分布信息,以便进行跨类别级别的比较。
4.2.1 箱线图
主要描述数据的中位数、上四分位数、下四分位数、四分位距和极值
sns.catplot(x="day", y="total_bill", hue="smoker", kind="box", data=tips)
seaborn.boxenplot()是箱线图的优化版本,形式与箱线图类似,但是提供了更丰富的分布信息,适应于规模更大的数据
diamonds = sns.load_dataset("diamonds")
sns.catplot(x="color", y="price", kind="boxen",
data=diamonds.sort_values("color"))
4.2.2 小提琴图
相当于核密度图和箱线图的融合版本
sns.catplot(x="total_bill", y="day", hue="sex",
kind="violin", data=tips)
- 因为融合了核密度图的特点,所以小提琴图包含了更丰富的分布信息,但是也引入了核密度图的相关参数设定(如参数
bw
或cut
等),使得绘图过程更加复杂 - 小提琴图的信息是对称的,可以通过参数
split=True
,保留一半的图像,更有效地利用空间 - 对于小提琴图内部的箱线图,可以通过参数
inner
更改为其他图像
小提琴图也可以和带状散点图或蜂群状散点图结合,实现更丰富的可视化
g = sns.catplot(x="day", y="total_bill", kind="violin", inner=None, data=tips)
sns.swarmplot(x="day", y="total_bill", color="k", size=3, data=tips, ax=g.ax)
4.3 带分类的关联图
4.3.1 条形图
titanic = sns.load_dataset("titanic")
sns.catplot(x="sex", y="survived", hue="class", kind="bar", data=titanic)
- 条形图主要用于显示每个类别的估计值(默认为平均值)
- seaborn绘图时,会通过自助法(bootstrapping)计算估计值的误差区间
当需要计算每个类别的数据量时,就需要用到countplot()函数
sns.catplot(x="deck", kind="count", palette="ch:.25", data=titanic)
- 这是条形图的一种特殊情况,用于评估数据的集中趋势
4.3.2 点线图
sns.catplot(x="class", y="survived", hue="sex",
palette={"male": "g", "female": "m"},
markers=["^", "o"], linestyles=["-", "--"],
kind="point", data=titanic)
- 点线图和条形图所包含的信息是相似的,都包含估计值和误差区间
- 点线图还通过趋势线,进行了斜率的描述,同时相比于条形图整个绘图更简明
4.4 绘制'宽格式'数据
iris = sns.load_dataset("iris")
sns.catplot(data=iris, orient="h", kind="box")
4.5 分面网格分类图
sns.catplot(x="day", y="total_bill", hue="smoker",
col="time", aspect=.7,
kind="swarm", data=tips)
iris = sns.load_dataset("iris")
sns.catplot(data=iris, orient="h", kind="box")
5 回归图
使用回归模型来估计两组包含噪声的观测数据之间的简单关系,并进行可视化
5.1 线性回归图
regplot()和lmplot()是绘制线性回归图的两种函数
这两个函数密切相关,并且大部分核心功能是共享
regplot() VS lmplot()
- regplot()接受各种格式的x和y变量,包括简单的numpy数组、Series对象,或者通过DataFrame对象引用其中的数据和变量
- lmplot()将数据作为必需参数,并且x和y变量必须指定为字符串。这种数据格式称为“长格式”或“整齐”数据。并且lmplot()基本包含regplot()的特性,所以后续分析将以lmplot()为主
sns.lmplot(x="size", y="tip", data=tips, x_jitter=.05);
- 默认调用线性回归方法,并返回95%的置信区间
- 参数
x_jitter
是用于添加散点图的随机扰动,处理离散型变量过于集中不便观察的问题 - 参数
x_estimator
可以用于指定回归方法,比如取值np.mean
就表示取均值进行回归
5.2 其他回归方法
简单的线性回归不一致适用于所有模型
5.2.1 多项式回归
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
order=2, ci=None, scatter_kws={"s": 80});
- 参数
order
用于指定多项式回归的阶数,本示例为二次函数拟合 - 参数
ci=None
取消置信区间的显示 - 参数
scatter_kws
用于指定散点图部分的参数
5.2.2 稳健线性回归
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),
robust=True, ci=None, scatter_kws={"s": 80});
- 对于存在异常值的情况,可以采用稳健线性回归进行拟合
5.2.3 逻辑回归
sns.lmplot(x="total_bill", y="big_tip", data=tips,
logistic=True, y_jitter=.03);
- 对于因变量只有两种取值的情况,可以考虑采用逻辑回归进行拟合
5.2.4 非参数拟合
sns.lmplot(x="total_bill", y="tip", data=tips,
lowess=True);
- 使用低平滑的方式拟合非参数回归
- 不需要太多的前提假设
5.3 残差图
sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),
scatter_kws={"s": 80});
- 残差图主要用于检查简单回归模型的有效性
- 理想情况下,残差应该分布在
y=0
附近
5.4 分面网格回归图
sns.lmplot(x="total_bill", y="tip", hue="smoker",
col="time", row="sex", data=tips);
5.5 回归图融入复合可视化
5.5.1 jointplot()与回归图
sns.jointplot(x="total_bill", y="tip", data=tips, kind="reg");
5.5.2 pairplot()与回归图
sns.pairplot(tips, x_vars=["total_bill", "size"], y_vars=["tip"],
hue="smoker", height=5, aspect=.8, kind="reg");
6 矩阵图/分面网格图
6.1 FacetGrid对象
FacetGrid对象
- 一个FacetGrid对象包含三个维度:
row
,col
和hue
- 每个图形级函数都在背后使用了这个对象
g = sns.FacetGrid(tips, col="day", height=4, aspect=.5)
g.map(sns.barplot, "sex", "total_bill", order=["Male", "Female"])
还可以通过调用底层的matplotlib中的 Figure
和 Axes
对象实现更灵活的定制
g = sns.FacetGrid(tips, col="smoker", margin_titles=True, height=4)
g.map(plt.scatter, "total_bill", "tip", color="#338844", edgecolor="white", s=50, lw=1)
for ax in g.axes_dict.values():
ax.axline((0, 0), slope=.2, c=".2", ls="--", zorder=0)
g.set(xlim=(0, 60), ylim=(0, 14))
6.2 PairGrid对象
PairGrid对象
- 对角线位置显示每个变量的分布情况
- 其他位置展示数据集中的每一对变量的关系
- 牺牲了一定灵活性以实现快速绘图
iris = sns.load_dataset("iris")
g = sns.PairGrid(iris, hue="species")
g.map_diag(sns.histplot)
g.map_offdiag(sns.scatterplot)
g.add_legend()
6.3 热力图
flights = sns.load_dataset("flights")
ax = sns.heatmap(flights, annot=True, fmt="d")
- 可以通过参数
annot
和fmt
设置单元格是否显示及其格式 - 可以通过参数
linewidths
控制不同单元格之间的间隙