Seaborn是一个用Python制作统计图形的库。 它建立在matplotlib之上,并与pandas数据结构紧密集成,功能强大到无法想象。
本文主要使用一下几种函数绘图:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
单变量分布可视化是通过将单变量数据进行统计从而实现画出概率分布的功能,同时概率分布有直方图与概率分布曲线两种形式。利用displot()对单变量分布画出直方图(可以取消),并自动进行概率分布的拟合(也可以使用参数取消)。
sns.set_style('darkgrid')
x = np.random.randn(200)
sns.distplot(x);
sns.distplot(x,hist = False);
#boxplot绘制单变量箱型图
tips = sns.load_dataset("tips")
ax = sns.boxplot(x=tips["total_bill"])
#绘制数量统计图
titanic = sns.load_dataset("titanic")
ax = sns.countplot(x="class", data=titanic)
双变量分布通俗来说就是分析两个变量的联合概率分布和每一个变量的分布。
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");
我们可以将某一个想要观测的类别,按照指定字段分类统计总数分布:
ax = sns.countplot(x="class", hue="who", data=titanic)
对于数据集有多个变量的情况,如果每一对都要画出相关关系可能会比较麻烦,利用Seaborn可以很简单的画出数据集中每个变量之间的关系。
iris = sns.load_dataset("iris")
sns.pairplot(iris); # 对角线化的是单变量的分布
统计分析是了解数据集中的变量如何相互关联以及这些关系如何依赖于其他变量的过程,有时候在对数据集完全不了解的情况下,可以利用散点图和连线图对其进行可视化分析,这里主要用到的函数是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);
也可用scatterplot方法实现同样的功能:
ax = sns.scatterplot(x="total_bill", y="tip", hue="smoker", style="smoker", data=tips)
但是scatterplot功能更加强大,可以通过修改style参数,实现更多参数同时显示效果:
#实现四个参数同时展示
ax = sns.scatterplot(x="total_bill", y="tip", hue="smoker", style="time", data=tips)
为了进行数据分析,除了散点图,同样可以使用连续的线形来描述变化趋势。
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);
# 也可以使用样式来区分,这里不加赘述
seaborn的目标是通过可视化快速简便地探索数据集,因为这样做比通过统计探索数据集更重要。用统计模型来估计两组噪声观察之间的简单关系可能会非常有用,因此就需要用简单的线性来可视化。
主要用regplot()进行画图,这个函数绘制两个变量的散点图,x和y,然后拟合回归模型并绘制得到的回归直线和该回归一个95%置信区间。
sns.set_style('darkgrid')
sns.regplot(x="total_bill", 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);
我们之前学习了如何使用散点图和回归模型拟合来可视化两个变量之间的关系。但是,如果感兴趣的主要变量之一类别的,那该怎么办?在这种情况下,散点图和回归模型方法将不起作用,就需要利用专门的分类可视化函数进行拟合。
注:画图函数分为两种形式: 底层的类似于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);
#使用boxplot实现多维箱型图分析
ax = sns.boxplot(x="day", y="total_bill", 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);
如果我们更加关心类别之间的变化趋势,而不是每个类别内的分布情况,同样可以使用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);
参考文章:
https://zhuanlan.zhihu.com/p/40303932
https://seaborn.pydata.org/api.html