Seaborn 基于matplotlib且数据结构与pandas统一的统计制图库
功能:
一般情况下跟matplotlib一起使用
目录
**********艺术化的图表控制
控制样式
扩展绘图
**********斑驳陆离的调色板
分类色板
使用圆形颜色系统
连续色板
cubehelix_palette()函数的连续调色板
使用light_palette() 和dark_palette()调用定制连续调色板
离散色板
**********分布数据集的可视化(---开始有丶用---)
单变量分布
直方图
核密度估计(KDE) Kernel density estimaton
拟合参数分布
绘制双变量分布
散点图
HexBin图
核密度估计
呈现数据集中成对的关系(可以用于单变量分析)
**********线性关系的可视化
绘制线性回归模型的函数
不同类型的模型拟合
控制绘制的大小和形状
在其他背景下绘制回归
**********分类数据的绘制
**********绘制数据网格
# seaborn 是第三方库,需要pip安装
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
# 生成一个含偏移的正弦图像
def sinplot(flip=1):
x = np.linspace(0,14,100)
for i in range(1,7):
plt.plot(x,np.sin(x+i*.5)*(7-i)*flip)
# 直接使用matplotlib画图
sinplot()
使用seaborn控制画图样式
# 以下全是默认参数,可以不填
sns.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif',
font_scale=1, color_codes=True, rc=None)
sinplot()
为了控制样式,使用axes_style()和set_style()函数。为了扩展绘图,请使用plotting_context()和set_context()函数。在这两种情况下,第一个函数返回一个参数字典,第二个函数则设置matplotlib默认属性。
# context:
#darkgrid 黑色网格(默认)
#whitegrid 白色网格
#dark 黑色背景
#white 白色背景
#ticks 应该是四周有刻度线的白背景
# 控制样式
sns.axes_style() # 返回set_style函数的参数字典,如果需要传给set_index函数,所有的参数以字典的形式传给rc参数
sns.set_style() # 设置matplotlib默认属性
sns.set_style("whitegrid")
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
sns.boxplot(data=data)
# 修改底色
sns.set_style("dark")
sinplot()
f, ax = plt.subplots()
sns.violinplot(data=data)
# offset 两坐标轴离开距离;
sns.despine(offset=10, trim=True)
# despine 管理边框
# despine(fig=None, ax=None, top=True, right=True, left=False, bottom=False, offset=None,trim=False)
sns.set_style("whitegrid")
sns.boxplot(data=data, palette="deep")
sns.despine(left=True) # 删除左边边框
st = sns.axes_style("darkgrid")
# 设置临时图形样式(只对with块内的绘图函数起作用)
with sns.axes_style("darkgrid"):
plt.subplot(211)
sinplot()
plt.subplot(212)
sinplot(-1)
# 重置图形样式
sns.set()
# 拓展绘图
sns.plotting_context() # 返回一个参数字典,设置字体、线条
sns.set_context() # 设置参数
# 设置线条粗细
# 按相对尺寸的顺序(线条越来越粗),分别是paper,notebook, talk, and poster
sns.set_context("paper")
plt.figure(figsize=(8,6))
sinplot()
# default 默认设置
sns.set_context("notebook")
plt.figure(figsize=(8,6))
sinplot()
最重要的直接设置调色板的函数就是color_palette()。color_palette()允许任意的seaborn调色板或matplotlib的颜色映射(除了jet,你应该完全不使用它)。它还可以使用任何有效的matplotlib格式指定的颜色列表(RGB元组、十六进制颜色代码或HTML颜色名称)。返回值总是一个RGB元组的列表。
直接调用没有传入参数的color_palette()将返回默认的颜色循环。
对应的函数set_palette()接受相同的参数,并为所有图设置默认的颜色循环。你也可以在with块中使用color_palette()来实现临时的更改调色板配置。
分类色板(定性)是在区分没有固定顺序的数据时最好的选择。
在导入seaborn库后,默认的颜色循环被更改为一组六种颜色(最新版本已经更新为10种)。
# 默认颜色循环
current_palette = sns.color_palette()
sns.palplot(current_palette)
对应的RGB元组:
(0.2980392156862745, 0.4470588235294118, 0.6901960784313725)
(0.8666666666666667, 0.5176470588235295, 0.3215686274509804)
(0.3333333333333333, 0.6588235294117647, 0.40784313725490196)
(0.7686274509803922, 0.3058823529411765, 0.3215686274509804)
(0.5058823529411764, 0.4470588235294118, 0.7019607843137254)
(0.5764705882352941, 0.47058823529411764, 0.3764705882352941)
(0.8549019607843137, 0.5450980392156862, 0.7647058823529411)
(0.5490196078431373, 0.5490196078431373, 0.5490196078431373)
(0.8, 0.7254901960784313, 0.4549019607843137)
(0.39215686274509803, 0.7098039215686275, 0.803921568627451)
默认颜色主题共有六种不同的变化分别是:deep, muted, pastel, bright, dark, 和 colorblind。类似下面的方式直接传入即可。
current_palette = sns.color_palette("colorblind") # 直接传入对应的参数即可变化
sns.palplot(current_palette)
当你有六个以上的分类要区分时,最简单的方法就是在一个圆形的颜色空间中画出均匀间隔的颜色(这样的色调会保持亮度和饱和度不变)。这是大多数的当他们需要使用比当前默认颜色循环中设置的颜色更多时的默认方案。
最常用的方法是使用hls的颜色空间,这是RGB值的一个简单转换。
sns.palplot(sns.color_palette("hls", 8))
当然,也可以使用hls_palette()函数来控制颜色的亮度和饱和。
sns.palplot(sns.hls_palette(8, l=.3, s=.8))
# l-亮度 lightness / s-饱和 saturation
由于人类视觉系统的工作方式,会导致在RGB度量上强度一致的颜色在视觉中并不平衡。比如,我们黄色和绿色是相对较亮的颜色,而蓝色则相对较暗,使得这可能会成为与hls系统一致的一个问题。
为了解决这一问题,seaborn为husl系统提供了一个接口,这也使得选择均匀间隔的色彩变得更加容易,同时保持亮度和饱和度更加一致。
sns.palplot(sns.color_palette("husl", 8))
使用xkcd颜色来命名颜色
xkcd包含了一套众包努力的针对随机RGB色的命名。产生了954个可以随时通过xdcd_rgb字典中调用的命名颜色。
plt.plot([0, 1], [0, 1], sns.xkcd_rgb["pale red"], lw=3)
plt.plot([0, 1], [0, 2], sns.xkcd_rgb["medium green"], lw=3)
plt.plot([0, 1], [0, 3], sns.xkcd_rgb["denim blue"], lw=3)
调色板中第二大类称为“顺序”。这种颜色映射对应的是从相对低价值(无意义)数据到高价值(有意义)的数据范围。虽然有时候你会需要一个连续的离散颜色调色板,用他们像kdeplot()或者corrplot()功能映射更加常见(以及可能类似的matplotlib功能)。
Color Brewer的字典中就有一组很好的调色板。它们是以在调色板中的主导颜色(或颜色)命名的。
sns.palplot(sns.color_palette("Blues"))
就像在matplotlib中一样,如果您想要翻转渐变,您可以在面板名称中添加一个_r后缀。
sns.palplot(sns.color_palette("BuGn_r"))
seaborn还增加了一个允许创建没有动态范围的"dark"面板。如果你想按顺序画线或点,这可能是有用的,因为颜色鲜艳的线可能很难区分。
类似的,这种暗处理的颜色,需要在面板名称中添加一个_d后缀
sns.palplot(sns.color_palette("GnBu_d"))
cubehelix调色板系统具有线性增加或降低亮度和色调变化顺序的调色板。这意味着在你的映射信息会在保存为黑色和白色(为印刷)时或被一个色盲的人浏览时可以得以保留。
Matplotlib拥有一个默认的内置cubehelix版本可供创建:
sns.palplot(sns.color_palette("cubehelix", 8))
seaborn为cubehelix系统添加一个接口使得其可以在各种变化中都保持良好的亮度线性梯度。
通过seaborn的cubehelix_palette()函数返回的调色板与matplotlib默认值稍有所不同,它不会在色轮周围旋转或覆盖更广的强度范围。seaborn还改变了排序使得更重要的值显得更暗:
sns.palplot(sns.cubehelix_palette(8))
其他cubehelix_palette()的参数主要调整色板的视觉。两个重要的选择是:start(值的范围为0--3)和rot,还有rot的次数(-1--1之间的任意值)
sns.palplot(sns.cubehelix_palette(8, start=.5, rot=-.75))
也可以控制断点的亮度和甚至对调结果顺序
n_colors:调色板中的颜色数,int
start
:第一个色调,float,0 <= start <= 3
rot
:围绕调色板范围内的色相控制盘旋转,float
gamma
:float 0 <= gamma,Gamma 系数用以强调较深 (Gamma < 1) 或较浅 (Gamma > 1) 的颜色
hue
:float, 0 <= hue <= 1,颜色的饱和度
dark
:float 0 <= dark <= 1,调色板中最暗颜色的强度
light
:float 0 <= light <= 1,调色板中最浅颜色的强度
reverse
:bool,如果为 True 值,则调色板将从暗到亮。
as_cmap
:bool,如果为 True 值,则返回 matplotlib colormap 而不是颜色列表。
返回值:palette or cmap
:seaborn 调色板或者 matplotlib colormap
sns.palplot(sns.cubehelix_palette(8, start=2, rot=0, dark=0, light=.95, reverse=True))
默认情况下只会得到一些与seaborn调色板相似的颜色的列表,也可以让调色板返回一个可以用as_cmap=True传入seaborn或matplotlib函数的颜色映射对象
调用light_palette() 和dark_palette(),这与一个单一颜色和随机种子产生的从亮到暗的饱和度的调色板相同。
sns.palplot(sns.light_palette("green"))
sns.palplot(sns.dark_palette("purple"))
这些调色板结果也可以颠倒
sns.palplot(sns.light_palette("navy", reverse=True))
也可以创建一个颜色映射对象取代颜色列表
pal = sns.dark_palette("palegreen", as_cmap=True)
sns.kdeplot(x, y, cmap=pal);
调色板中的第三类被称为“离散”。用于可能无论大的低的值和大的高的值都非常重要的数据。数据中通常有一个定义良好的中点。例如,如果你正在绘制温度变化从基线值,最好使用不同色图显示相对降低和相对增加面积的地区。
sns.palplot(sns.color_palette("BrBG", 7))
sns.palplot(sns.color_palette("RdBu_r", 7))
另一个在matplotlib中建立的明智的选择是coolwarm面板。请注意,这个颜色映射在中间值和极端之间并没有太大的对比
sns.palplot(sns.color_palette("coolwarm", 7))
用diverging_palette()使用定制离散色板
你也可以使用海运功能diverging_palette()为离散的数据创建一个定制的颜色映射。(当然也有一个类似配套的互动工具:choose_diverging_palette())。该函数使用husl颜色系统的离散色板。你需随意传递两种颜色,并设定明度和饱和度的端点。函数将使用husl的端点值及由此产生的中间值进行均衡。
seaborn.diverging_palette(h_neg, h_pos, s=75, l=50, sep=10, n=6, center='light', as_cmap=False)
h_neg, h_pos
:float in [0, 359],图的正负范围的锚定色调
s
:[0, 100] 范围内的浮点数,可选,图的两个范围的锚定饱和度
l
:[0, 100] 范围内的浮点数,可选,图的两个范围的锚定亮度
n
:int,可选,调色板中的颜色数(如果为not,返回一个colormap)
center
:{“light”, “dark”}, 可选,调色板中心为亮或暗
as_cmap
:bool, 可选,如果为 true,返回一个 matplotlib colormap 而不是一个颜色列表。
返回值:palette or cmap
:seaborn color palette or matplotlib colormap
sns.palplot(sns.diverging_palette(220, 20, n=7))
sns.palplot(sns.diverging_palette(145, 280, s=85, l=25, n=7))
用set_palette()更改色变的默认值
color_palette() 函数有一个名为set_palette()的配套。它们之间的关系类似于在美学教程中涉及的aesthetics tutorial. set_palette()。set_palette()接受与color_palette()相同的参数,但是它会更改默认的matplotlib参数,以便成为所有的调色板配置。
def sinplot(flip=1):
x = np.linspace(0, 14, 100)
for i in range(1, 7):
plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)
sns.set_palette("husl")
sinplot()
color_palette()函数也可以在一个with块中使用,以达到临时更改调色板的目的
with sns.color_palette("PuBuGn_d"):
sinplot()
简单常用色彩总结:
用于检查单变量和双变量分布的一些工具,用来了解变量是如何分布的。从视觉上来看,seaborn的作图效果比matplotlib好很多。
import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt
# 导入seaborn
import seaborn as sns
sns.set(color_codes=True)
# 设置随机种子
np.random.seed(sum(map(ord, "distributions")))
最方便的方式是快速查看单变量分布无疑是使用distplot()函数。默认情况下,这将绘制一个直方图,并拟合出核密度估计(KDE)。
x = np.random.normal(size=100)
sns.distplot(x)
直方图应当是非常熟悉的函数了,在matplotlib中就存在hist函数。直方图通过在数据的范围内切成数据片段,然后绘制每个数据片段中的观察次数,来表示整体数据的分布。
删除密度曲线并添加了地毯图,每个观察点绘制一个小的垂直刻度。可以使用rugplot()函数来制作地毯图,但它也可以在distplot()中使用:
seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)
该函数结合了matplotlib中的 hist
函数(自动计算一个默认的合适的bin大小)、seaborn的kdeplot()
和rugplot()
函数。它还可以拟合scipy.stats
分布并在数据上绘制估计的PDF(概率分布函数)。
a
:Series、1维数组或者列表。观察数据,如果是具有name
属性的Series对象,则该名称将用于标记数据轴。
bins
:matplotlib hist()的参数,或None。可选参数。直方图bins(柱)的数目,若填None,则默认使用Freedman-Diaconis规则指定柱的数目。
hist
:布尔值,可选参数。是否绘制(标准化)直方图。
kde
:布尔值,可选参数。是否绘制高斯核密度估计图。
rug
:布尔值,可选参数。是否在横轴上绘制观测值竖线。
fit
:随机变量对象,可选参数。一个带有fit方法的对象,返回一个元组,该元组可以传递给pdf方法一个位置参数,该位置参数遵循一个值的网格用于评估pdf(概率分布函数)。
{hist, kde, rug, fit}_kws
:字典,可选参数。底层绘图函数的关键字参数。
color
:matplotlib color,可选参数。可以绘制除了拟合曲线之外所有内容的颜色。
vertical
:布尔值,可选参数。如果为True,则观测值在y轴显示(即把图形顺时针旋转90°)。
norm_hist
:布尔值,可选参数。如果为True,则直方图的高度显示密度而不是计数。如果绘制KDE图或拟合密度,则默认为True。
axlabel
:字符串,False或者None,可选参数。横轴的名称。如果为None,将尝试从a.name获取它;如果为False,则不设置标签。
label
:字符串,可选参数。图形相关组成部分的图例标签。
ax
:matplotlib axis,可选参数。若提供该参数,则在参数设定的轴上绘图。
返回值:ax
:matplotlib Axes
sns.distplot(x, kde=False, rug=True)
将特定参数传递给基础绘图函数:
ax = sns.distplot(x, rug=True, rug_kws={"color": "g"},
kde_kws={"color": "k", "lw": 3, "label": "KDE"},
hist_kws={"histtype": "step", "linewidth": 3,
"alpha": 1, "color": "g"})
使用核密度估计和小的垂直线绘制分布图:
ax = sns.distplot(x, rug=True, hist=False)
使用直方图和最大似然高斯分布拟合绘制分布图:
from scipy.stats import norm
ax = sns.distplot(x, fit=norm, kde=False)
绘制KDE比绘制直方图更有计算性。所发生的是,每一个观察都被一个以这个值为中心的正态( 高斯)曲线所取代。
x = np.random.normal(0, 1, size=30)
bandwidth = 1.06 * x.std() * x.size ** (-1 / 5.)
support = np.linspace(-4, 4, 200)
kernels = []
for x_i in x:
kernel = stats.norm(x_i, bandwidth).pdf(support)
kernels.append(kernel)
plt.plot(support, kernel, color="r")
sns.rugplot(x, color=".2", linewidth=3)
接下来,这些曲线可以用来计算支持网格中每个点的密度值。得到的曲线再用归一化使得它下面的面积等于1:
density = np.sum(kernels, axis=0)
# 标准化
# from scipy import stats, integrate
density /= integrate.trapz(density, support)
plt.plot(support, density)
可以看到,如果我们在seaborn中使用kdeplot()函数,我们得到相同的曲线。 这个函数由distplot()使用,但是当您只想要密度估计时,它提供了一个更直接的界面,更容易访问其他选项:
sns.kdeplot(x, shade=True)
使用distplot()将参数分布拟合到数据集,并可视化地评估其与观察数据的对应关系:
x = np.random.gamma(6, size=200)
sns.distplot(x, kde=False, fit=stats.gamma)
在绘制两个变量的双变量分布也是有用的。在seaborn中这样做的最简单的方法就是在jointplot()函数中创建一个多面板数字,显示两个变量之间的双变量(或联合)关系以及每个变量的单变量(或边际)分布和轴。
sns.jointplot(x=df['A'], y=df['B'], #设置xy轴,显示columns名称
data = df, #设置数据
color = 'b', #设置颜色
#s = 50, edgecolor = 'w', linewidth = 1,#设置散点大小、边缘颜色及宽度(只针对scatter)
stat_func=sci.pearsonr,
kind = 'hex',#设置类型:'scatter','reg','resid','kde','hex'
space = 0.1, #设置散点图和布局图的间距
size = 8, #图表大小(自动调整为正方形))
ratio = 5, #散点图与布局图高度比,整型
# marginal_kws = dict(bins=15, rug =True) #设置柱状图箱数,是否设置rug
)
mean, cov = [0, 1], [(1, .5), (.5, 1)]
# 根据实际情况生成一个多元正态分布矩阵
# mean:mean是多维分布的均值维度为1
# cov:协方差矩阵,注意:协方差矩阵必须是对称的且需为半正定矩阵
# size:指定生成的正态分布矩阵的维度(例:若size=(1, 1, 2),则输出的矩阵的shape即形状为 1X1X2XN(N为mean的长度))
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])
sns.jointplot(df['x'], df['y'])
直方图的双变量类似物被称为“hexbin”图,因为它显示了落在六边形仓内的观测数。该图适用于较大的数据集。通过matplotlib plt.hexbin函数和jointplot()中的样式可以实现。 它最好使用白色背景:
x, y = np.random.multivariate_normal(mean, cov, 1000).T
with sns.axes_style("white"):
sns.jointplot(x=x, y=y, kind="hex", color="k")
使用上述内核密度估计程序可视化双变量分布也是可行的。在seaborn中,这种图用等高线图显示,可以在jointplot()中作为样式传入参数使用:
sns.jointplot(x="x", y="y", data=df, kind="kde")
还可以使用kdeplot()函数绘制二维核密度图。这样可以将这种绘图绘制到一个特定的(可能已经存在的)matplotlib轴上,而jointplot()函数只能管理自己:
f, ax = plt.subplots(figsize=(6, 6))
sns.kdeplot(df.x, df.y, ax=ax)
sns.rugplot(df.x, color="g", ax=ax)
sns.rugplot(df.y, vertical=True, ax=ax)
jointplot()函数使用JointGrid来管理。为了获得更多的灵活性,您可能需要直接使用JointGrid绘制图形。jointplot()在绘制后返回JointGrid对象,您可以使用它来添加更多图层或调整可视化的其他方面:
g = sns.jointplot(x="x", y="y", data=df, kind="kde", color="m")
g.plot_joint(plt.scatter, c="w", s=30, linewidth=1, marker="+")
g.ax_joint.collections[0].set_alpha(0)
g.set_axis_labels("$X$", "$Y$")
要在数据集中绘制多个成对双变量分布,可以使用pairplot()函数。这将创建一个轴的矩阵,并显示DataFrame中每对列的关系。默认情况下,它也绘制每个变量在对角轴上的单变量:
iris = sns.load_dataset("iris")
sns.pairplot(iris)
对于jointplot()和JointGrid之间的关系,pairplot()函数是建立在一个PairGrid对象上的,可以直接使用它来获得更大的灵活性:
g = sns.PairGrid(iris)
g.map_diag(sns.kdeplot)
g.map_offdiag(sns.kdeplot, cmap="Blues_d", n_levels=6)
许多数据集包含多个定量变量,分析的目的通常是将这些变量相互关联起来。然而,使用统计模型来估计两个噪声观测组之间的简单关系可能是非常有帮助的。Seaborn的回归图主要是为了添加一个视觉指南,有助于在探索性数据分析期间强调数据集中的模式。 也就是说,Seaborn本身并不是统计分析的一揽子计划。Seaborn的目标是通过可视化快速,轻松地探索数据集,使之变得与通过统计表格来探索数据集一样重要。
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
# 导入seaborn
import seaborn as sns
sns.set(color_codes=True)
# 设置随机种子
np.random.seed(sum(map(ord, "regression")))
# 加载数据集
tips = sns.load_dataset("tips")
使用Seaborn中的两个主要功能可视化通过回归确定的线性关系。这些函数regplot()和lmplot()是密切相关的,并且共享了大部分的核心功能。然而,了解他们不同的方式很重要,以便您可以快速为特定工作选择正确的工具。
在最简单的调用中,两个函数绘制了两个变量x和y的散点图,然后拟合回归模型y〜x并绘制了该回归线的结果回归线和95%置信区间:
sns.regplot(x="total_bill", y="tip", data=tips)
sns.lmplot(x="total_bill", y="tip", data=tips)
显然,所得到的的图的结果是相同的,除了图形形状略有些不同。
目前,已知的另一个主要区别是regplot()以各种格式接受x和y变量,包括numpy数组、Pandas的Series列或DataFrame对象的变量引用;不一样的是,lmplot()将数据集作为一个必需的参数,而x和y变量必须指定为字符串。这种数据格式称为“长格式”或“整洁”数据。除了这种输入灵活性,regplot()可以看做是拥有lmplot()特征的子集。
注:上面的结果可以在regplot()函数中通过只传入x和y绘出:sns.regplot(x=tips["total_bill"], y=tips["tip"]);而相应的sns.lmplot(x=tips["total_bill"], y=tips["tip"])这种写法就会报错,因为数据集data是lmplot()的必传参数。
当其中一个变量取值为离散型的时候,可以拟合一个线性回归。然而,这种数据集生成的简单散点图通常不是最优的:
tips.head()
# total_bill tip sex smoker day time size big_tip
# 16.99 1.01 Female No Sun Dinner 2 False
# 10.34 1.66 Male No Sun Dinner 3 True
# 21.01 3.50 Male No Sun Dinner 3 True
# 23.68 3.31 Male No Sun Dinner 2 False
# 24.59 3.61 Female No Sun Dinner 4 False
sns.lmplot(data=tips,x="size",y="tip")
一个常用的方法是为离散值添加一些随机噪声的“抖动”(jitter),使得这些值的分布更加明晰。
值得注意的是,抖动仅适用于散点图数据,且不会影响拟合的回归线本身
sns.lmplot(x="size", y="tip", data=tips, x_jitter=.05)
另一种选择是在每个独立的数据分组中对观察结果进行折叠,以绘制中心趋势的估计以及置信区间:
sns.lmplot(x="size", y="tip", data=tips, x_estimator=np.mean)
上面使用的简单线性回归模型非常简单,但是,它不适用于某些种类的数据集。
Anscombe数据集显示了一些简单线性回归提供了简单目视检查清楚显示差异的关系估计的例子。 例如,在第一种情况下,线性回归是一个很好的模型:
anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),
ci=None, scatter_kws={"s": 80})
第二个数据集中的线性关系是一样的,但是基本清楚地表明这不是一个好的模型:
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
ci=None, scatter_kws={"s": 80});
在存在这些高阶关系的情况下,lmplot()和regplot()可以拟合多项式回归模型来拟合数据集中的简单类型的非线性趋势:
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
order=2, ci=None, scatter_kws={"s": 80})
除了正在研究的主要关系之外,“异常值”观察还有一个不同的问题,它们由于某种原因而偏离了主要关系:
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),
ci=None, scatter_kws={"s": 80})
在有异常值的情况下,它可以使用不同的损失函数来减小相对较大的残差,拟合一个健壮的回归模型,传入robust=True:
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),
robust=True, ci=None, scatter_kws={"s": 80})
tips["big_tip"] = (tips.tip / tips.total_bill) > .15
sns.lmplot(x="total_bill", y="big_tip", data=tips,
y_jitter=.03)
在这种情况下,解决方案是拟合逻辑(Logistic)回归,使得回归线显示给定值x的y=1的估计概率:
sns.lmplot(x="total_bill", y="big_tip", data=tips,
logistic=True, y_jitter=.03)
逻辑回归估计比简单回归计算密集程度(Robust回归也是如此),并且由于使用引导程序计算回归线周围的置信区间,您可能希望将其关闭获得更快的迭代速度(使用参数ci=None)。
一个完全不同的方法是使用一个lowess smoother拟合非参数回归。 这种方法具有最少的假设,尽管它是计算密集型的,因此目前根本不计算置信区间:
sns.lmplot(x="total_bill", y="tip", data=tips,
lowess=True)
residplot()是一个有用的工具,用于检查简单的回归模型是否拟合数据集。它拟合并移除一个简单的线性回归,然后绘制每个观察值的残差值。 理想情况下,这些值应随机散布在y = 0附近:
如果残差中有结构,则表明简单的线性回归是不合适的:
sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
scatter_kws={"s": 80})
上面的图表显示了许多方法来探索一对变量之间的关系。然而,通常,一个更有趣的问题是“这两个变量之间的关系如何作为第三个变量的函数而变化?”这是regplot()和lmplot()之间的区别。 虽然regplot()总是显示单个关系,lmplot()将regplot()与FacetGrid结合在一起,提供了一个简单的界面,可以在“faceted”图上显示线性回归,从而允许探索与多达三个其他类别变量的交互。
分类关系的最佳方式是绘制相同轴上的两个级别,并使用颜色来区分它们:
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)
除了颜色之外,还可以使用不同的散点图标记来使黑色和白色的图像更好地绘制。 您还可以完全控制所用的颜色:
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips,
markers=["o", "x"], palette="Set1")
要添加另一个变量,您可以绘制多个“facet”,每个级别的变量出现在网格的行或列中:
sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips);
sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", row="sex", data=tips)
由regplot()和lmplot()创建的默认绘图看起来是一样的,但在轴上却具有不同大小和形状。 这是因为func:regplot是一个“轴级”功能绘制到特定的轴上。 这意味着可以自己制作多面板图形,并精确控制回归图的位置。 如果没有提供轴,它只需使用“当前活动的”轴,这就是为什么默认绘图与大多数其他matplotlib函数具有相同的大小和形状的原因。要控制大小,您需要自己创建一个图形对象。
f, ax = plt.subplots(figsize=(5, 6))
sns.regplot(x="total_bill", y="tip", data=tips, ax=ax)
相反,lmplot()图的大小和形状通过FacetGrid界面使用size和aspect参数进行控制,这些参数适用于每个图中的设置,而不是整体图形:
sns.lmplot(x="total_bill", y="tip", col="day", data=tips, col_wrap=2, size=3)
sns.lmplot(x="total_bill", y="tip", col="day", data=tips, aspect=.5)
另外一些Seaborn函数在更大,更复杂的绘制中使用regplot()。 第一个是在上一章分布介绍的jointplot()函数。 除了前面讨论的绘图样式之外,jointplot()可以使用regplot()通过传递kind ="reg"来显示关节轴上的线性回归拟合:
sns.jointplot(x="total_bill", y="tip", data=tips, kind="reg")
使用kind="reg"的pairplot()函数结合了regplot()和PairGrid来显示数据集中变量之间的线性关系。 注意这是不同于lmplot()的。 在下图中,两轴在第三个变量的两个级别上不显示相同的关系; 相反,PairGrid()用于显示数据集中变量的不同配对之间的多个关系:
sns.pairplot(tips, x_vars=["total_bill", "size"], y_vars=["tip"], size=5, aspect=.8, kind="reg")
类似lmplot(),但不同于jointplot(),使用hue参数在pairplot()中内置了一个附加分类变量的条件:
sns.pairplot(tips, x_vars=["total_bill", "size"], y_vars=["tip"], hue="smoker", size=5, aspect=.8, kind="reg")