著名写博客“有一无二”表演艺术家👨‍🎨,终于要出一次“二”了.

另附上收集的seaborn速查表:seaborn cheatsheet

接上一篇文章数据可视化:把玩一下seaborn(二)

重申一下引入类库和环境:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
sns.set(color_codes=True)

上回书说完了seaborn按照数据类别或者数据统计关系进行可视化的基本方法,这次主要聊一聊想要展现数据分布和线性关系时应该如何操作.

然后介绍一下数据线性关系的可视化方法

数据分布的可视化 Visualizing the distribution of a dataset

拿到数据集后,通常第一件事就是确定数据的分布,接下来我们看一下对于单变量(unvariable)和双变量(bivariable)分布如何进行可视化.

绘制单变量分布图 Ploting univariate distributions

单变量分布的常见可视化模式是直方图(histogram)或者KDA(kernel debsity estimate),在seaborn中使用的方法是displot(), 其中的hist属性控制是否显示直方图(默认开启),kda属性控制是否显示KDA分布(默认开启),rug属性控制显示刻度(默认关闭)

x = np.random.normal(size=100)
sns.distplot(x,hist=True,kde=True, rug=True);

直方图没什么说的,是观察数据分布常见且直观的一个方法,原理也比较简单. 这里重点说一下KDE,它本身在很多领域都是极其重要的工具. 绘制kde图还可以使用kdeplot()方法或者rugplot()方法,例如下面的例子

x = np.random.normal(0, 1, size=30)
sns.kdeplot(x)
sns.kdeplot(x, shade=True, bw=.2,  label="bw: .2"); # shade属性控制是否显示分布区域阴影
sns.kdeplot(x, bw=2, label="bw: 2") 
plt.legend();

从图中可以看出,bw属性控制的是kde曲线的拟合程度.

绘制双变量分布图 Ploting bivariate distributions

首先我们创建一个数据集作为例子

mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])

绘制双变量分布图的方法是jointplot(),用多个面板从两个维度绘制数据分布,seaborn提供了scatterplot(defult),hexbin,kde三种样式

sns.jointplot(x="x", y="y", data=df);

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");

sns.jointplot(x="x", y="y", data=df, kind="kde");

其实kdeplot()也可以实现kde双变量分布

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);

可视化数据集中的成对关系 Visualizing pairwise relationships in a dataset

例如调用数据集iris(鸢尾属植物)

iris = sns.load_dataset("iris")

然后使用pairplot()方法

sns.pairplot(iris, hue="species");

解读一下这个图,根据坐标轴上的四个属性sepal_width sepa_heightpetal_length petal_width的对应关系,用一个4*4 的矩阵展示了不同条件下三个物种的分布情况.

线性关系的可视化 Visualizing linear relationships

线性回归模型在数据可视化中可以展示数据的分布和趋势,也可以起到预测数据的作用.

我们还是使用小费tips数据集

tips = sns.load_dataset("tips")

画线性回归模型的方法 Functions to draw linear regression models

seaborn提供了两个方法regplot()lmplot()

sns.regplot(x="total_bill", y="tip", data=tips);

sns.lmplot(x="total_bill", y="tip", data=tips);

通过上面两个例子 ,会发现这两个方法绘制的结果区别不大,但是他们传入的数据是有区别的

regplot()xy轴可以是简单的numpy数组,pandasseries对象或者pandasDataFrame对象

lmplot()的x,y参数必须指定为字符串

拟合不同种类的数据 Fitting different kinds of models

anscombe = sns.load_dataset("anscombe")

以数据集Anscombe’s quartet(安斯库姆四重奏)为例,先通过下面的表格简单了解一下这个数据集,简单是说就是四组包含<x,y>的数据集:

然后plot一下四组数据(注意这里使用lmplot,所以x,y轴对应的是字符串),基本工作流程是使用数据集和用于构造网格的变量初始化FacetGrid对象。:

sns.lmplot(x="x", y="y", col="dataset", col_wrap=2, data=anscombe,
           ci=None,scatter_kws={"s": 80});

现在分析一下这四个数据集,第一个没啥显著特征,观察第二个数据集可以发现它存在高阶关系,可以通过order属性控制阶数,进行多项式回归拟合

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
           order=2, ci=None, scatter_kws={"s": 80});

第三个数据集存在一个噪点outlier影响了拟合效果,可以使用roboust属性保持健壮性

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),
           robust=True, ci=None, scatter_kws={"s": 80});

未完待续… …