1、引言
在大数据时代,数据挖掘的工作越来越重要,而从数据中提取出来有吸引力的图表更是一件非常重要的事情。而除了Matplotlib,基于其开发的Seaborn在数据可视化方面功能也非常强大。相比于Matplotlib来说,Seaborn提供更高层次的API,可以让你在不需要了解那么多底层参数的情况下,同样能够画出比较有吸引力的图表。本文参照来源:Official seaborn tutorialseaborn.pydata.org
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
2、图像审美
这里当然不是说审美的标准是什么,而是如何调节图像的样式。这一块自由度太高就不具体介绍,就简单介绍一个修改背景的功能。
def sinplot(flip=1):
x = np.linspace(0, 14, 100)
for i in range(1, 7):
plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)
sinplot()
# 对两种画图进行比较
fig = plt.figure()
sns.set()
sinplot()
主要有五种预设seaborn主题:darkgrid,whitegrid,dark,white,和ticks,利用set_style()来修改,不过这个修改是全局性的,会影响后面所有的图像。
sns.set_style('dark')
sinplot()
sns.set_style('whitegrid')
sinplot()
3、可视化函数
对数据的可视化操作,乍看起来很复杂,其实种类总结起来可以分为下面几种:
1. 单变量分布可视化(displot)
2. 双变量分布可视化(jointplot)
3. 数据集中成对双变量分布(pairplot)
4. 双变量-三变量散点图(relplot)
5. 双变量-三变量连线图(relplot)
6. 双变量-三变量简单拟合
7. 分类数据的特殊绘图
4、单变量分布
单变量分布可视化是通过将单变量数据进行统计从而实现画出概率分布的功能,同时概率分布有直方图与概率分布曲线两种形式。利用displot()对单变量分布画出直方图(可以取消),并自动进行概率分布的拟合(也可以使用参数取消)。
sns.set_style('darkgrid')
x = np.random.randn(200)
sns.distplot(x);
sns.distplot(x,hist = False);
5、双变量分布
双变量分布通俗来说就是分析两个变量的联合概率分布和每一个变量的分布。
import pandas as pd
mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])
sns.jointplot(x="x", y="y", data=df);
# 同样可以使用曲线来拟合分布密度
sns.jointplot(x="x", y="y", data=df, kind="kde");
6、数据集中成对双变量分析
对于数据集有多个变量的情况,如果每一对都要画出相关关系可能会比较麻烦,利用Seaborn可以很简单的画出数据集中每个变量之间的关系。
iris = sns.load_dataset("iris")
sns.pairplot(iris);
# 对角线化的是单变量的分布
7、双变量-三变量散点图
统计分析是了解数据集中的变量如何相互关联以及这些关系如何依赖于其他变量的过程,有时候在对数据集完全不了解的情况下,可以利用散点图和连线图对其进行可视化分析,这里主要用到的函数是relplot函数。
tips = sns.load_dataset("tips")
sns.relplot(x="total_bill", y="tip", data=tips);
# 除了画出双变量的散点图外,还可以利用颜色来增加一个维度将点分离开
sns.relplot(x="total_bill", y="tip", hue="smoker", data=tips);
# 为了强调数据之间的差异性,除了颜色也可以使用图形的不同来分类数据点(颜色和形状互相独立)
sns.relplot(x="total_bill", y="tip", hue="smoker", style="smoker",data=tips);
8、双变量-三变量连续图
为了进行数据分析,除了散点图,同样可以使用连续的线形来描述变化趋势。
df = pd.DataFrame(dict(time=np.arange(500),value=np.random.randn(500).cumsum()))
sns.relplot(x="time", y="value", kind="line", data=df);
# 可以选择不对x进行排序,仅仅需要修改sort参数即可
df = pd.DataFrame(np.random.randn(500, 2).cumsum(axis=0), columns=["x", "y"])
sns.relplot(x="x", y="y", sort=False, kind="line", data=df);
# 为了使线形更加的平滑可以使用聚合功能,表示对x变量的相同值进行多次测量,取平均,并取可信区间
fmri = sns.load_dataset("fmri")
plt.figure();
sns.relplot(x="timepoint", y="signal", kind="line", data=fmri);
plt.figure();
sns.relplot(x="timepoint", y="signal",estimator=None,kind="line", data=fmri);
# 同时也可以使用颜色来区别不同种类
sns.relplot(x="timepoint", y="signal", hue="event", kind="line", data=fmri);
# 也可以使用样式来区分,这里不加赘述
9、简单线性拟合
seaborn的目标是通过可视化快速简便地探索数据集,因为这样做比通过统计探索数据集更重要。用统计模型来估计两组噪声观察之间的简单关系可能会非常有用,因此就需要用简单的线性来可视化。
线性模型可视化
主要用regplot()进行画图,这个函数绘制两个变量的散点图,x和y,然后拟合回归模型并绘制得到的回归直线和该回归一个95%置信区间。
sns.set_style('darkgrid')
sns.regplot(x="total_bill", y="tip", data=tips);
sns.regplot(x="size", y="tip", data=tips);
# 对分类模型适应不好
拟合不同类型的模型
线性模型对某些数据可能适应不够好,可以使用高阶模型拟合
anscombe = sns.load_dataset("anscombe")
sns.regplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),ci=None);
# 利用order2阶模型来拟合
sns.regplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),ci=None,order = 2);
# 如果数据中有明显错误的数据点可以进行删除
sns.regplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),ci=None);
plt.figure()
sns.regplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),ci=None,robust = True);
10、类型数据特殊绘图
我们之前学习了如何使用散点图和回归模型拟合来可视化两个变量之间的关系。但是,如果感兴趣的主要变量之一类别的,那该怎么办?在这种情况下,散点图和回归模型方法将不起作用,就需要利用专门的分类可视化函数进行拟合。
注:画图函数分为两种形式:底层的类似于scatterplot(),swarmplot()来分别实现功能
高层的类似于catplot()通过修改参数来实现上面底层的功能
分类散点图
可以使用两种方法来画出不同数据的分类情况,第一种是每个类别分布在对应的横轴坐标上,而第二种是为了展示出数据密度的分布从而将数据产生少量随即抖动进行可视化的方法。
# 微小抖动来展示出数据分布
sns.catplot(x="day", y="total_bill", data=tips);
# 利用jitter来控制抖动大小或者是否抖动
sns.catplot(x="day", y="total_bill", jitter = False,data=tips);
# 同时可以使用swarm方法来使得图形分布均匀
sns.catplot(x="day", y="total_bill", kind="swarm", data=tips);
# 值得注意的是,与上面的scatter相同,catplot函数可以使用hue来添加一维,但是暂不支持style
sns.catplot(x="day", y="total_bill", hue="sex", kind="swarm", data=tips);
分类分布图
随着数据的增加,分类数据的离散图更为复杂,这时候需要对每类数据进行分布统计。这里同样使用高级函数catplot()。
# 箱线图
# 显示了分布的三个四分位数值以及极值
sns.catplot(x="day", y="total_bill", kind="box", data=tips);
# 同样可以使用hue来增加维度
sns.catplot(x="day", y="total_bill", hue="smoker", kind="box", data=tips);
# 小提琴图事实上是密度图和箱型图的结合
# 分别表示箱型图的含义和任意位置的概练密度
sns.catplot(x="day", y="total_bill", hue="time",kind="violin", data=tips);
# 当hue参数只有两个级别时,也可以“拆分”小提琴,这样可以更有效地利用空间
sns.catplot(x="day", y="total_bill", hue="sex",kind="violin", split=True, data=tips);
分类估计图
如果我们更加关心类别之间的变化趋势,而不是每个类别内的分布情况,同样可以使用catplot来进行可视化。
# 条形图,利用bar来画出每个类别的平均值
# 黑色表示估计区间
titanic = sns.load_dataset("titanic")
sns.catplot(x="sex", y="survived", hue="class", kind="bar", data=titanic);
# 如果更加关心的是类别的数量而不是统计数据的话可以使用count
sns.catplot(x="deck", kind="count", data=titanic);
# 点图功能提供了一种可视化相同信息的替代方式
# 只画出估计值和区间,而不画出完整的条形图
sns.catplot(x="sex", y="survived", hue="class", kind="point", data=titanic);
# 更加复杂的设置,通过对每一个参数进行设置来调节图像
sns.catplot(x="class", y="survived", hue="sex",
palette={"male": "g", "female": "m"},
markers=["^", "o"], linestyles=["-", "--"],
kind="point", data=titanic);
总结
本文是在官方文档基础上进行总结分类,对Seaborn功能建立一个整体的框架,通过功能来对图像进行分类,文中所有例程来自于Seaborn0.9教程。