用Seaborn包实现数据可视化

Seaborn包在Matplotlib包的基础上开发而成,主要用于统计数据的可视化。Seaborn包绘制的图表有自己的风格,是十分优秀的Python数据可视化包。在Excel内置Python中使用Seaborn包,因为默认初始化Excel内置Python时已经导入该包,所以可以直接使用Seaborn包的别名sns。[大谦Excel,dqexcel点com]

箱形图

箱形图可以表现数值型数据的分布特征,常用于图形法查找数据中的异常值。箱形图的绘图原理参见用分位数法查找异常值,大于75%分位数+1.5倍内四分极差的数据,或者小于25%分位数-1.5倍内四分极差的数据视为异常值。Seaborn包中用boxplot函数绘制箱形图。

图7-21所示工作表中,A-E列为一些雇员的ID,性别、部门、受教育程度和工资数据。单元格F1在Python模式下,在公式栏输入下面的代码,绘制箱形图:

code.python
df=xl("$A$1:$E$101",headers=True)
sns.boxplot(df,x='Education',y='Salary',hue='Gender')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.legend(fontsize=16)
plt.xlabel('Education',fontsize=16)
plt.ylabel('Salary',fontsize=16)

在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域G1:K14,绘图效果如图7-21中上图所示。

箱形图主要有中间颜色填充的矩形、矩形中的横线、矩形上下的触须和触须以外的散点等几部分组成。矩形的上下边对应于数据的75%分位数和25%分位数,75%分位数和25%分位数的差为内四分极差。矩形中间的横线对应数据的中值,即50%分位数。上面的触须横线对应于75%分位数+1.5倍内四分极差,下面的触须横线对应于35%分位数-1.5倍内四分极差。触须之外的散点就是要找的异常值了。

Seaborn包也可以绘制横向的箱形图。单元格F15在Python模式下,在公式栏输入下面的代码:

code.python
df=xl("$A$1:$E$101",headers=True)
sns.boxplot(df,x='Salary',y='Education',hue='Gender')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.legend(fontsize=16)
plt.xlabel('Salary',fontsize=16)
plt.ylabel('Education',fontsize=16)

在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域G15:K27,绘图效果如图7-21中下图所示。

Document Image

图7-21 箱形图

小提琴图

小提琴图如图7-22中所示,它可以看作是箱形图和核密度曲线图的组合。小提琴图中间有一个黑色的细长矩形,矩形中间有一个白点。白点对应数据中值,矩形上下边对应75%分位数和25%分位数。曲线上下靠近的地方可视为75%分位数+1.5倍内四分极差的位置和25%分位数-1.5倍内四分极差的位置。曲线可以更精细地描述数据的分布特征。

图7-22所示工作表中,单元格F1在Python模式下,在公式栏输入下面的代码,绘制小提琴图:

code.python
df=xl("$A$1:$E$101",headers=True)
sns.violinplot(df,x='Education',y='Salary',hue='Gender')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.legend(fontsize=16)
plt.xlabel('Education',fontsize=16)
plt.ylabel('Salary',fontsize=16)

在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域G1:K14,绘图效果如图7-22中上图所示。代码中用violinplot函数绘制小提琴图。

Document Image

图7-22 小提琴图

Seaborn包也可以绘制横向的小提琴图。单元格F15在Python模式下,在公式栏输入下面的代码:

code.python
df=xl("$A$1:$E$101",headers=True)
sns.violinplot(df,x='Salary',y='Education',hue='Gender')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.legend(fontsize=16)
plt.xlabel('Salary',fontsize=16)
plt.ylabel('Education',fontsize=16)

在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域G15:K27,绘图效果如图7-22中下图所示。

矩阵散点图

矩阵散点图常用于表现多变量数据的分布以及它们两两之间的关系。图7-23中绘制了多种不同表现形式的矩阵散点图。Seaborn包用pairplot函数绘制矩阵散点图。

图7-23所示工作表中,单元格E1在Python模式下,在公式栏输入下面的代码,绘制矩阵散点图:

code.python
df=xl("A1:D407",headers=True)
sns.pairplot(df,hue='Cylinders')
sns.set(font_scale=1.8)

在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域F1:J14,绘图效果如图7-23中第一个图所示。pairplot函数中,hue参数指定一个分类变量对各组数据分别着色。图中,对不同变量的数据两两之间绘散点图,因为这里变量有分组的情况,绘制的是复合散点图。对角线位置绘制的是各变量数据的核密度曲线图,有分组时对各分组数据分别绘制曲线。用set函数设置字体大小为默认大小的1.8倍。

Document Image

图7-23 矩阵散点图

对于不分组的情况,单元格E16在Python模式下,在公式栏输入下面的代码,绘制矩阵散点图:

code.python
df=xl("A1:C407",headers=True)
sns.pairplot(df)
sns.set(font_scale=1.8)

在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域F16:I28,绘图效果如图7-23中第一列第二个图所示。可见,数据没有分组的情况,对角线上绘制各变量数据的直方图。

单元格L1在Python模式下,在公式栏输入下面的代码,绘制矩阵散点图:

code.python
df=xl("$A$1:$C$407",headers=True)
sns.pairplot(df,kind='kde')
sns.set(font_scale=1.8)

在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域M1:Q14,绘图效果如图7-23中第二列第一个图所示。代码中将pairplot函数的kind参数的值设置为’kde’,绘制不同变量两两之间的核密度曲线图。Kind参数可取的值包括 ‘scatter’,’kde’,’hist’和’reg’。设置为’reg’时会在散点图的基础上添加回归曲线。

单元格L16在Python模式下,在公式栏输入下面的代码,绘制矩阵散点图:

code.python
df=xl("$A$1:$C$407",headers=True)
sns.pairplot(df,corner=True)
sns.set(font_scale=1.8)

在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域M16:Q28,绘图效果如图7-23中第二列第二个图所示。代码中将pairplot函数的corner参数的值设置为True,只绘制下三角的矩阵散点图。

边际图

边际图在散点图的上边和右边绘制直方图或核密度曲线图来表现数据的边缘分布特征。Seaborn包用jointplot函数绘制边际图。

图7-24所示工作表中,单元格D2在Python模式下,在公式栏输入下面的代码,绘制边际图:

code.python
df=xl("A1:C407",headers=True)
sns.jointplot(df,x='MPG',y='Acceleration')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.xlabel('Salary',fontsize=16)
plt.ylabel('Education',fontsize=16)

在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域E2:I15,绘图效果如图7-24中左图所示。数据没有分组的情况下在散点图上边和右边绘制直方图。

单元格L2在Python模式下,在公式栏输入下面的代码,绘制边际图:

code.python
df=xl("A1:C407",headers=True)
sns.jointplot(df,x='MPG',y='Acceleration',hue='Cylinders')
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.legend(fontsize=16)
plt.xlabel('Salary',fontsize=16)
plt.ylabel('Education',fontsize=16)

在公式栏中单击Ctrl+Enter键,返回一个Image对象。显示该对象,合并单元格区域L2:P15,绘图效果如图7-24中右图所示。代码中用jointplot函数的hue参数对数据进行了分组,数据有分组时在散点图上边和右边绘制各分组数据的核密度曲线图。

Document Image

图7-24 边际图