数据可视化:把玩一下seaborn(二)
著名写博客“有一无二”表演艺术家👨🎨,终于要出一次“二”了.
另附上收集的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_height
和petal_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()
的x
和y
轴可以是简单的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});
未完待续… …