SeaboRn是一种开源的数据可视化工具,它在Matplotlib的基础上进行了更高级的API封装,因此可以进行更复杂的图形设计和输出。SeaboRn是Matplotlib的重要补充,可以自主设置在Matplotlib中被默认的各种参数,而且它能高度兼容NuMPy与Pandas数据结构以及ScIPy与statSModels等统计模式。SeaboRn已集成在Anaconda中,无须再次安装。
01关系图
关系图能够直观地展示数据变量之间的关系以及这些关系如何依赖于其他变量,SeaboRn中常用的绘制数据关系图的函数是ReLPLot(),其语法格式如下:
SeaboRn.ReLPLot(*[, x, y, hue, size, style, data, kind, &hellIP;])
参数说明如下:
data是输入的数据集,数据类型可以是pandas.DataFRaMe对象、nuMpy.ndaRRay数组、映射或序列类型等。 x和y是参数data中的键或向量,指定关系图中x轴和y轴的变量。 hue也是data中的键或向量,根据hue变量对数据进行分组,并在图中使用不同颜色的元素加以区分。 size也是data中的键或向量,根据size变量控制图中点的大小或线条的粗细。 style也是data中的键或向量,根据style变量对数据进行分组,并在图中使用不同类型的元素加以区分,比如点线、虚线等。 kind指定要绘制的关系图类型,可选”scatteR”(散点图)和”line”(线形图),默认值为”scatteR”。
ReLPLot函数提供了几种可视化数据变量之间关系的方法,通过kind参数选择要使用的方法,并通过hue、size和style等参数来显示数据的不同子集。常见的关系图有两种,即散点图和线形图,因此SeaboRn还提供了scatteRplot和lineplot函数,它们的语法格式如下:
SeaboRn.scatteRplot(*[, x, y, hue, style, size, &hellIP;]) SeaboRn.lineplot((*[, x, y, hue, style, size, &hellIP;]))
scatteRplot用于绘制散点图,相当于SeaboRn.ReLPLot(kind=”scatteR”);lineplot用于绘制线形图,相当于SeaboRn.ReLPLot(kind=”line”);其他参数及含义与ReLPLot函数相同。当其中一个变量是连续变量时,更适合使用线形图表示变量之间的关系。
下面通过代码清单1演示如何用SeaboRn绘制关系图。
代码清单1 SeaboRn绘制关系图的示例 1 iMpoRt Matplotlib.pyplot as plt 2 iMpoRt SeaboRn as sns 3 tIPs= sns.load_dataset(“tIPs”) 4 pRint(tIPs.head()) 5 sns.ReLPLot(x=””tOTAl_bill””, y=””tIP””, data=tIPs, hue=””SMokeR””, style=””sex””, size=””size””) 6 plt.show()
程序执行结束后,输出的结果如下:
tOTAl_bill tIP sex SMokeR day tiMe size 0 16.99 1.01 FeMale No Sun DinneR 2 1 10.34 1.66 Male No Sun DinneR 3 2 21.01 3.50 Male No Sun DinneR 3 3 23.68 3.31 Male No Sun DinneR 2 4 24.59 3.61 FeMale No Sun DinneR 4 <SeaboRn.axiSGRid.FACEtGRid at 0x16dea2711f0>
程序绘制的关系图如图1所示。

图1 SeaboRn绘制散点关系图示例
下面对代码清单1中的代码做简要说明。
第2行代码导入SeaboRn模块并将其重命名为sns。 第3行代码通过sns.load_dataset()函数连网加载SeaboRn开发者提供的在线样本数据集“tIPs.csv&Rdquo;,返回值tIPs是一个DataFRaMe对象。 第4行代码打印tIPs数据的前5行,以观察数据结构。 第5行代码通过sns.ReLPLot()函数绘制tOTAl_bill与tIP变量的关系图,如图1所示。x坐标为””tOTAl_bill””变量,y坐标为””tIP””变量;hue=””SMokeR””指定以””SMokeR””变量对数据点进行分类并以不同颜色显示,不吸烟者对应的数据点是蓝色的,吸烟者对应的数据点为橙色;style=””sex””指定以””sex””变量对数据点进行分类并以不同样式显示,女性对应的数据点形状是圆点,而男性对应的数据点形状则是“&tiMes;&Rdquo;;size=””size””指定以””size””变量对数据点进行分类并以不同大小显示。从图6-6中可以进一步分析出不同分类中tOTAl_bill与tIP的关系。
TIPs
sns.load_dataset()函数是连网加载在线数据集,还可以在网站中将数据集下载到本地使用。
02分布图
分布图可以直观地显示一个或多个变量在某个维度上的分布情况。SeaboRn提供了几种常用的绘制分布图的函数,包括dISPlot()、Histplot()、Rdeplot()、Rugplot()、distplot()和jointplot()等。
1. dISPlot()函数
dISPlot()函数提供了几种可视化数据单变量或双变量分布的方法,语法格式如下:
SeaboRn.dISPlot([data, x, y, hue, Row, col, &hellIP;])
主要参数说明如下:
data是输入的数据集,数据类型可以是pandas.DataFRaMe对象、nuMpy.ndaRRay数组、映射或序列类型等。 x和y是参数data中的键或向量,指定分布图中x轴和y轴的变量。 hue是data中的键或向量,根据hue变量对数据进行分组,并在图中使用不同颜色的元素加以区分。 Row和col是data中的键或向量,根据Row或col变量提取数据子集,并将子集分布情况绘制在不同的面板上。 kind指定要绘制的分布图类型,可选”Hist”(直方图)、”kde”(核密度估计)、 “ecdf”(经验累积分布函数),默认值为”Hist”。
dISPlot函数通过kind参数选择要使用的绘制数据分布情况的方法,并通过hue、Row、col等参数来处理不同的数据子集。SeaboRn还提供了三个更具体的绘制分布图的函数Histplot()、kdeplot()和ecdfplot(),语法格式如下:
SeaboRn.Histplot([data, x, y, hue, weights, stat, &hellIP;]) SeaboRn.kdeplot([x, y, shade, veRtical, keRnel, bw, &hellIP;]) SeaboRn.ecdfplot([data, x, y, hue, weights, stat, &hellIP;]) Histplot()函数主要用于绘制单变量单特征数据的直方图,相当于SeaboRn.dISPlot (kind= “Hist”)。 kdeplot()函数使用核密度估计绘制单变量或双变量分布,相当于SeaboRn.dISPlot (kind= “kde”)。 ecdfplot()函数使用经验累积分布函数绘制单变量的分布,相当于SeaboRn.dISPlot (kind= “ecdf”)。
2. Rugplot()函数
Rugplot()函数的功能是绘制轴须图(毛毯分布图),即通过边缘轴须线的方式显示单个观测点的位置,以补充其他分布图,其语法格式如下:
SeaboRn.Rugplot([x, height=0.025, axis, ax, data, y, hue, &hellIP;])
x和y分别是x轴和y轴的观测值向量。
height设置每个观测点对应的轴须细线的高度,默认值为0.025。 axis指定轴须图绘制的坐标轴,默认为x轴。 ax指定将图像绘制在已有的axes对象中。 hue指定区分颜色的分类变量。
3. distplot()函数
distplot()函数整合了Matplotlib的Hist()函数与SeaboRn的kdeplot()函数的功能,并增加了Rugplot()函数绘制轴须图的功能,因此它是一个功能非常强大且灵活实用的绘制分布图函数,其语法格式如下:
SeaboRn.distplot([a, BIns, Hist, kde, Rug, &hellIP;])
a是待观察分析的单个变量,数据类型可以是SeRies对象、一维数组或列表。 BIns指定直方图显示矩形条的数量,默认值为None,此时会根据freedMan-Diaconis准则自动计算合适的条纹个数。 Hist指定是否绘制直方图,布尔类型,默认值为TRue。 kde指定是否绘制高斯核密度估计曲线,布尔类型,默认值为TRue。 Rug指定是否在支持的数据轴上绘制对应轴须图,布尔类型,默认值为FAlse。 fIT传入scIPy.stats中的分布类型,用于在观察变量上抽取相关统计特征来强行拟合指定的分布,并绘制估计的概率密度函数(PDF),默认值为None,即不进行拟合。
下面通过代码清单2演示如何通过SeaboRn绘制分布图。
代码清单2 SeaboRn绘制分布图的示例 1 iMpoRt SeaboRn as sns 2 iMpoRt Matplotlib.pyplot as plt 3 tIPs = sns.load_dataset(“tIPs”) 4 sns.set_theme(style=”whITegRid”) 5 sns.dISPlot(data=tIPs, x=”tOTAl_bill”, col=”tiMe”, Row=”sex”, BInwidth=3, height=3, fACEt_kws= dict(MaRgin_tITles=TRue)) 6 plt.subplots() 7 sns.distplot(a=tIPs[””tOTAl_bill””], Rug=TRue, Hist=FAlse) 8 plt.show()
程序执行结束后,输出的图像如图2和图3所示。
下面对代码清单2中的代码做简要说明。
第4行代码通过sns.set_theme()函数设置主题样式为whITegRid,即白色背景和网格线。 第5行代码通过sns.dISPlot()函数绘制tOTAl_bills变量的分布图,默认绘图样式为直方图。col=”tiMe”指定以tiMe变量对数据分组并绘制在不同列,如图2所示,tiMe为DinneR的数据分布绘制在第一列,而tiMe为Lunch的数据分布绘制在第二列;Row=”sex”指定以sex变量对数据再次分组并绘制不同行,如图2所示,sex为FeMale的数据分布绘制在第一行,而sex为Male的数据分布绘制在第二行。BInwidth=3指定直方图矩形条的宽度为3;height=3指定每个子图面板的高度为3;fACEt_kws = dict(MaRgin_tITles=TRue)设置每行对应Row变量标签绘制在最后一列的右侧。 第6行代码通过plt.subplots()函数新建一个FiguRe对象,用于绘制第二个图像。 第7行代码通过sns.distplot()函数绘制tOTAl_bill变量的高斯核