Seaborn是Python基于matplotlib的数据可视化工具。它提供了很多高层封装的函数,帮助数据分析人员快速绘制美观的数据图形,而避免了许多额外的参数配置问题。 本案例中,我们以波士顿房价数据集为例,演示如何使用seaborn绘制常见的图形。包括散点图、柱状图、饼图、直方图、盒图、概率密度图、小提琴图和点对图等。

波士顿房价数据集中每一列数据对应的含义如下表所示:

3-6-13 Seaborn绘图入门实践

1 数据准备

首先我们可以使用pandas将数据文件读取,数据类型为DataFrame。

import pandas as pd 
boston = pd.read_csv("./input/boston_house_prices.csv") 
boston.head(10)

3-6-13 Seaborn绘图入门实践

%matplotlib inline
import seaborn as sns

2 散点图

散点图能够同时将两个数值型特征可视化,从散点图中我们可以直观地观察两个特征之间的关系。例如是否存在线性关系等。 seaborn中可以使用 jointplot 函数绘制散点图。jointplot函数通常由三个参数需要设置,x和y分别代表需要横轴和纵轴显示的特征名称。data为数据,可以为DataFrame类型。例如在房价数据中,我们需要绘制犯罪率(CRIM)与房价(MEDV)之间的散点图,可以使用以下代码:

sns.jointplot(x="CRIM" , y = "MEDV" ,data = boston)

 

3-6-13 Seaborn绘图入门实践

 

从上图可以发现,我们不仅得到了两个特征的散点图,对于每一个单独的特征,jointplot函数默认将其直方图进行了绘制。同时,也将特征之间的皮尔逊相关系数计算出来。皮尔逊相关系数能够用来判断特征之间的线性关系,其取值范围为[-1,1]。取值为0表示两个特征没有相关性。越接近1说明特征之间越存在正相关性。越接近-1表示特征之间越存在负的线性相关性。在我们的上述例子中,皮尔逊相关系数为-0.39,说明犯罪率与房价之间存在一定的负相关性。

我们可以进一步使用 lmplot 方法将两个特征之间的线性回归直线也画出来。

sns.lmplot(x="CRIM" , y = "MEDV" ,data = boston)

 

3-6-13 Seaborn绘图入门实践

 

3 直方图

对于连续型特征,我们可以使用直方图来观察特征取值的分布情况。在seaborn中,直方图可以使用 distplot 函数进行绘制。例如,我们绘制出单位财产税(TAX)特征的直方图。

sns.distplot(boston["TAX"])

 

3-6-13 Seaborn绘图入门实践

 

distplot 函数默认同时绘制直方图和KDE(核密度图),如果不需要核密度图,可以将kde参数设置成False。

sns.distplot(boston["TAX"], kde = False)

 

3-6-13 Seaborn绘图入门实践

 

同样,我们可以绘制房间数的直方图。

sns.distplot(boston["RM"], kde = False)

 

3-6-13 Seaborn绘图入门实践

 

可见,房间数近似服从正态分布。我们可以通过bins参数设置分段数量,例如我们观察房价(MEDV)特征,将bins设置成100。

sns.distplot(boston["MEDV"], bins = 100, kde = False)

 

3-6-13 Seaborn绘图入门实践

 

4 盒图

盒图可以直观地将连续型特征的中位数、上下四分位数显示出来。通常也作为一种单特征离群值检测的定性方法。在seaborn中,可以使用 boxplot 函数绘制盒图。参数orient设置盒图的朝向。

sns.boxplot(boston["MEDV"],orient = "v")

 

3-6-13 Seaborn绘图入门实践

 

我们可以先对数据进行分组,然后对比不同组数据的分布(盒图表示)。我们只需要给 boxplot 函数制定x和y两个参数。其中,x为分组特征,需要为离散型。y为对比的特征。例如我们查看不同的房间数下,房价的分布情况,可以使用以下代码:

import math boston["RM_int"] = boston["RM"].map(math.floor) #对RM取整 
sns.boxplot(x="RM_int", y = "MEDV",data = boston, orient="v")

3-6-13 Seaborn绘图入门实践

 

通过上图可以看出,随着房间数目的增大,房价呈现先下降后上升的变化趋势。

进一步地,我们可以通过hue参数制定第二个分组特征。例如我们希望进一步观察房子是否在河边(CHAS)对房价的影响。

sns.boxplot(x="RM_int", y = "MEDV", hue = "CHAS",data = boston, orient="v")

 

3-6-13 Seaborn绘图入门实践

 

通过上述盒图,我们可以得出两个基本观察结论。首先,房间数小于5的房子都不在河边。其次,在房间数量相同的情况下,河边的房子比非河边的房子价格要高。以上两点与我们日常生活经验也是相符合的。

5 柱状图

对于离散型特征,我们可以使用柱状图绘制其每一种取值的样本数量。例如,对于房间数(RM_int),可以通过seaborn的 countplot 函数画出不同房间数量的房子的数量。

sns.countplot(x = "RM_int", data = boston)

 

3-6-13 Seaborn绘图入门实践

 

同样地,我们可以进一步制定一个分组特征绘制不同分组下的柱状图。

sns.countplot(x = "RM_int", hue = "CHAS", data = boston)

 

3-6-13 Seaborn绘图入门实践

 

6 核密度图

与直方图类似,核密度图也是一种研究特征分布的工具。在seaborn中,通过 kdeplot 函数绘制核密度图。

sns.kdeplot(boston["CRIM"])

3-6-13 Seaborn绘图入门实践

 

sns.kdeplot(boston["ZN"])

3-6-13 Seaborn绘图入门实践

 

我们可以绘制两个特征的核密度图。例如,绘制一氧化碳和低收入人群占比两个特征的核密度图。

sns.kdeplot(boston["NOX"], boston["LSTAT"])

3-6-13 Seaborn绘图入门实践

 

7 小提琴图

核密度图是一种结合了盒图和核密度图的图。它将盒图和密度图展示在同一个图上,因长相通常类似小提琴而得名。在seaborn中,可以使用 violinplot 函数绘制小提琴图。

sns.violinplot(x="RM_int", y = "MEDV",data = boston)

 

3-6-13 Seaborn绘图入门实践

 

与盒图类似,我们可以在小提琴图中制定额外的分组特征。

sns.violinplot(x="RM_int", y = "MEDV", hue = "CHAS",data = boston, orient="v")

3-6-13 Seaborn绘图入门实践

 

将上图的分组分别绘制在盒图的两边, 使用split=True参数设置。

sns.violinplot(x="RM_int", y = "MEDV", hue = "CHAS",split = True, data = boston)

 

3-6-13 Seaborn绘图入门实践

 

8 点对图

点对图可以同时将多个特征两两之间的散点图等通过一条命令进行绘制。点对图的绘制函数为 pairplot。为了显示美观,我们只选取数据找那个特征的一个子集进行绘制。

sns.pairplot(boston[["CRIM","NOX","RM","LSTAT","MEDV"]])

3-6-13 Seaborn绘图入门实践

 

9 热力图

import matplotlib.pyplot as plt 
corr = boston.corr()#特征的相关系数矩阵 
f, ax = plt.subplots(figsize=(10, 10)) 
cmap = sns.diverging_palette(220, 10, as_cmap=True) 
sns.heatmap(corr, cmap=cmap, vmax=1.0, square=True, xticklabels=2, yticklabels=2, linewidths=.3, cbar_kws={"shrink": .5}, ax=ax) 
plt.show()

 

3-6-13 Seaborn绘图入门实践

通过以上热力图我们可以直观地观察特征之间的相关性强弱。

相关文章: