Seaborn中的kdeplot、rugplot、distplot与jointplot

一、seaborn介绍

  seaborn是python中基于Matplotlib包具有更多可视化效果和更多风格的可视化模块,可以说是Matplotlib的封装。当我们想要探索单个或者一对数据分布上的特征时,可以使用seaborn中内置的若干函数对数据的分布进行多种多样的可视化。

二、kdeplot

  对于单变量和双变量进行核密度估计,并可视化,参数表如下:

kdeplot参数表
参数 说明
data 一维数组,单变量时作为唯一的量
data2 格式同data,单变量时不输入,双变量是作为第2个输入变量
shade bool型,是否对核密度估计曲线下的面积进行色彩填充,默认为False
vertical bool型,是否颠倒x-y轴位置(单变量输入时有效)
kernel 字符型,核密度估计的方法,默认为‘gau’,即高斯核,且在2维变量的情况下仅支持高斯核方法
legend bool型,是否在图像上添加图例
cumulative bool型,是否绘制核密度密度估计的累计分布,默认为False
shade_lowest

bool型,是否为核密度估计中最低的范围着色,主要用于在同一个坐标轴中比较多个不同分布总体,默认为True

cbar

bool型,是否在绘制二维核密度估计图时在图像右侧添加比色卡
color 字符型,控制核密度曲线的色彩,plt.plot()中的color参数
cmap 字符型,核密度区域的递进色彩方案,同plt.plot()中的cmap参数,如'Blues'代表蓝色系
n_levels int型,控制核密度区间的个数,反映在图像上的闭环层数

 

 

 

 

 

 

 

 

 

 

 

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(color_codes = True)
%matplotlib inline
mean = [0,2]
cov = [(1,0.5),(0.5,1)]
x,y = np.random.multivariate_normal(mean,cov,50).T

 numpy.random.multivariate_normal()函数解析

1、不修改其他参数只传入数据,绘制

#单变量
ax = sns.kdeplot(x)

2、加入红的填充区域并添加图例

# ax = sns.kdeplot(x,shade = True,color='r',legend=True)
ax = sns.kdeplot(x,shade=True,label='x')

3、修改为核密度估计的累计分布

ax = sns.kdeplot(x,shade=True,color='r',cumulative=True)

4、交换x-y轴位置

ax = sns.kdeplot(x,shade = True,color='r',vertical = True)

5、绘制双变量联合密度估计图 

ax = sns.kdeplot(x,y)

 

 6、修改调色方案,并设置shade_lowest = True、阴影填充及核密度区间个数

ax = sns.kdeplot(x,y,cmap='Blues',shade = True,shade_lowest=True)
ax = sns.kdeplot(x,y,cmap='Blues',shade = True,shade_lowest=True,n_levels=5)

 7、在同一个子图中绘制两个不同一维总体的核密度估计图

ax1 = sns.kdeplot(x,label='x',shade = True,color='r')
ax2 = sns.kdeplot(y,label='y',shade = True,color='y')

 

8、在同一个子图中绘制两个不同二维总体的核密度估计图

mean1 = [-1,1]
cov1 = [(0,0.3),(0.3,0.1)]
x1,y1 = np.random.multivariate_normal(mean1,cov1,30).T

ax1 = sns.kdeplot(x,y,cmap='Reds',shade=True,shade_lowest=False)
ax2 = sns.kdeplot(x1,y1,cmap='Greens',shade=True,shade_lowest=False)

三、rugplot

  用于绘制出一维数组中数据点实际的分布位置情况,即不添加任何数学意义上的拟合,只是单纯的记录值在坐标轴上进行展示,相当于kdeplot,可以展示出数据的离散分布情况。参数表如下:

rugplot参数表
参数 说明
a 一维数组,传入观测值向量 
height  设置每个观测点对应的小短条的高度,默认为0.05
axis  字符型变量,观测值对应小短条所在的轴,默认为'x',即x轴

 

 

 

 

 

1、使用默认参数进行绘制

ax = sns.rugplot(x)

 

 2、调换小短条所处的坐标轴并修改其高度与颜色

ax = sns.rugplot(x,axis='y',height = 0.3,color='y')

 

四、displot

  displot主要功能是绘制单变量的直方图,而且可以在直方图的基础之上加上kdeplot和rugplot的部分内容,其功能非常强大,其主要参数如下:

displot参数表
参数 说明
a 以为数组形式,传入带分析的变量
bins int型变量,确定直方图中限制直方的数量,默认为None
hist bool型,是描绘制直方图,默认为True
kde bool型,是否绘制核密度估计曲线,默认为True
rug bool型,是否绘制对应的rugplot部分,默认为False
fit 传入scipy_stats中的分布类型,用于观察变量上抽取相关统计特征来强行拟合的分布,默认为None,即不进行拟合

hist_kws

字典形式的输入,对应hist原生函数中的参数名称与参数值
kde_kws 同上
rug_kws 同上
color 控制除了fit部分拟合出的曲线之外的所有对象的色彩
vertical bool型,是否颠倒x-y轴,默认为False
norm_hist

bool型,表示直方图高度代表的意义,默认为False

True:直方图高度表示对应的密度

False:对应的直方区间内记录值个数

label 控制图像中的图例标签显示内容

 

 

 

 

 

 

 

 

 

 

 

 

1、使用默认参数进行绘制

import pandas as pd
x = pd.Series(x,name = 'x')
ax = sns.distplot(x)

2、修改所有对象颜色,绘制rugplot部分,并修改bins

ax = sns.distplot(x,color='r',rug=True,bins=20)

 

3、强行拟合卡方分布并利用参数字典设置fit曲线颜色 

ax = sns.distplot(x,color='r',rug=True,bins=20,kde=False,fit=None,
                  norm_hist=False,hist_kws={'alpha':0.6,'color':'orange'},
                  rug_kws={'color':'g'})

 4、修改norm_hist参数为False使得纵轴显示的不再是密度而是频数(注意这里必须关闭kde和fit绘图的部分,否则纵轴依然显示密度),利用hist_kws传入字典调整直方图部分色彩和透明度,利用rug_kws传入字典调整rugplot部分小短条色彩:

 

五、jointplot

  jointplot中聚合了kdeplot和rugplot中的相关内容,故放于最后进行介绍;

  jointplot主要用于对成对变量的相关情况联合分布各自的分布呈现于一张图表,jointplot的主要参数如下:

jointplot参数表
参数 说明
x,y

代表待分析的成对变量,有两种模式;

第一种模式:在参数data传入数据框时,x、y均传入字符串,指代数据框中的变量名;

第二种模式:在参数data为None时,x、y直接传入两个一维数组,不依赖数据框

data 与上一段中的说明相对应,代表数据框,默认为None
kind 字符型,展示成对变量相关情况的主图中的样式
color 图像中对象的色彩
height 图像为正方形时的边长
ratio int型,调节联合图与边缘图的相对比例,越大则边缘图越矮,默认为5
space int型,用于控制联合图与边缘图的空白大小
xlim,ylim 设置x轴与y轴显示范围

joint_kws,

marginal_kws,

annot_kws

传入参数字典来分别精细化控制每个组件

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1、使用默认参数绘制成对变量联合图

  模式一:在参数data传入数据框时,x、y均传入字符串,指代数据框中的变量名

data = pd.DataFrame()
data['x']=x
data['y']=y
ax = sns.jointplot(x='x',y='y',data=data)

  模式二:在参数data为None时,x、y直接传入两个一维数组,不依赖数据框

y = pd.Series(y,name='y')
ax = sns.jointplot(x=x,y=y)

2、将kind参数设置为‘reg’,为联合图添加线性回归拟合直线与核密度估计结果

y = pd.Series(y,name='y')
ax = sns.jointplot(x=x,y=y,kind='reg')

3、将kind参数设置为‘hex’,生成六边形核密度估计联合图

y = pd.Series(y,name='y')
ax = sns.jointplot(x=x,y=y,kind='hex')

4、将kind参数设置为‘kde’,将直方图和散点图转换为核密度估计图,并将边际轴的留白大小设定为0

y = pd.Series(y,name='y')
ax = sns.jointplot(x=x,y=y,kind='kde',space=0) 

5、利用边缘图形参数字典为边缘图形添加rugplot的内容,并修改直方个数为15

ax = sns.jointplot(x=x,y=y,color='g',kind='reg',marginal_kws={'bins':15,'rug':True})

 

 6、jointplot支持图层叠加

  例:我们首先绘制出的联合图中kind限制为拟合线性回归直线,在此基础上利用.plot_joint方法叠加核密度估计图层:

ax = sns.jointplot(x=x,y=y,color='g',kind='reg').plot_joint(sns.kdeplot,n_levels=5)

 

 

posted @ 2020-09-01 13:00  大脸猫12581  阅读(2449)  评论(0编辑  收藏  举报