Seaborn-statistical-data-visualization

Seaborn简介

Seaborn是一个用Python制作统计图形的库。它建立在matplotlib之上,并与pandas数据结构紧密集成。

以下是seaborn提供的一些功能:

  • 面向数据集的API,用于检查多个变量之间的关系
  • 专门支持使用分类变量来显示观察结果或汇总统计数据
  • 可视化单变量或双变量分布以及在数据子集之间进行比较的选项
  • 不同类型因变量的线性回归模型的自动估计和绘图
  • 方便地查看复杂数据集的整体结构
  • 用于构建多绘图网格的高级抽象,可让您轻松构建复杂的可视化
  • 简洁的控制matplotlib图形样式与几个内置主题
  • 用于选择调色板的工具,可以忠实地显示数据中的模式
  • Seaborn旨在使可视化成为探索和理解数据的核心部分。其面向数据集的绘图功能对包含整个数据集的数据框和数组进行操作,并在内部执行必要的语义映射和统计聚合,以生成信息图。

Seaborn官方文档:<http://seaborn.pydata.org/


一、set_style()/set()

1.1 set_style()

set_style()是用来设置主题的,Seaborn有五个预设好的主题:darkgrid,whitegrid,dark,white和ticks 默认:darkgrid

1
2
3
4
5
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("whitegrid")
plt.plot(np.arange(10))
plt.show()

1.2 set()

set( )通过设置参数可以用来设置背景,调色板等,更加常用。

1
2
3
4
5
6

import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="white", palette="muted", color_codes=True)
plt.plot(np.arange(10))
plt.show()

style就是所说的主题,白话一点就是背景,和set_style()是一样的。

palette是画板的意思,白话一点就是颜色,常见的颜色有:①deep/深色风,②muted/柔和风,③pastel/粉腊笔风,④bright/明亮风,⑤dark/黑暗风,⑥colorblind/色盲风,具体如下图所示。

二、kdeplot( )/distplot( )

2.1 kdeplot(核密度估计图)

核密度估计(kernel density estimation)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。通过核密度估计图可以比较直观的看出数据样本本身的分布特征。具体用法如下:

seaborn.kdeplot(data,data2=None,shade=False,vertical=False,kernel=‘gau’,bw=‘scott’,gridsize=100,cut=3,clip=None,legend=True,cumulative=False,shade_lowest=True,cbar=False, cbar_ax=None, cbar_kws=None, ax=None, **kwargs)

我们通过一些具体的例子来学习一些参数的用法。

首先导入我们所需的相关库:

1
2
3
4
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
2.1.1 绘制简单的一维kde图像
1
2
x = np.random.randn(100) # 创建100个服从正态分布的一维数据
sns.kdeplot(x)

2.1.2 shade:设置阴影,color:设置曲线及阴影颜色

shade若为True,则在kde曲线下面的区域中进行阴影处理,color控制曲线及阴影的颜色

1
sns.kdeplot(x,shade=False,color='g')

2.1.3 vertical:表示以X轴还是Y轴进行绘制
1
sns.kdeplot(x,vertical=True)

2.1.4 二元kde图像
1
2
3
x = np.random.randn(100)
y = np.random.randn(100)
sns.kdeplot(x,y,shade=True)

2.1.5 cbar:若为True,则会添加一个颜色棒(颜色棒在二元kde图像中才有)
1
sns.kdeplot(x,y,shade=True,cbar=True)

2.2 distplot()

distplot()集合了matplotlib的hist()与核函数估计kdeplot的功能,增加了rugplot分布观测条显示与利用scipy库fit拟合参数分布的新颖用途。具体用法如下:

seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)

先介绍一下直方图(Histograms):

直方图又称质量分布图,它是表示资料变化情况的一种主要工具。用直方图可以解析出资料的规则性,比较直观地看出产品质量特性的分布状态,对于资料分布状况一目了然,便于判断其总体质量的分布情况。直方图表示通过沿数据范围形成分箱,然后绘制条以显示落入每个分箱的观测次数的数据分布。

2.2.1 绘制distplot
1
sns.distplot(x,color="g")

2.2.2 通过histkde参数调节是否显示直方图及核密度估计(默认hist,kde均为True)
1
2
3
4
fig,axes = plt.subplots(1,3)
sns.distplot(x,ax=axes[0])
sns.distplot(x,hist=False,ax=axes[1])
sns.distplot(x,kde=False,ax=axes[2])

2.2.3 bins:int或list,控制直方图的划分
1
2
3
4
5
fig,axes=plt.subplots(1,2) 
#左图:分成20个区间
sns.distplot(x,kde=False,bins=20,ax=axes[0])
#右图:以0,1,2,3为分割点,形成区间[0,1],[1,2],[2,3],区间外的值不计入。
sns.distplot(x,kde=False,bins=[x for x in range(4)],ax=axes[1])

2.2.4 rag:控制是否生成观测数值的小细条
1
2
3
fig,axes=plt.subplots(1,2)
sns.distplot(x,rug=True,ax=axes[0]) #左图
sns.distplot(x,ax=axes[1]) #右图

2.2.5 fit:控制拟合的参数分布图形,能够直观地评估它与观察数据的对应关系(黑色线条为确定的分布)
1
2
from scipy.stats import *
sns.distplot(x,hist=False,fit=norm) #拟合标准正态分布

三、boxplot( )

箱形图(Box-plot),是一种用作显示一组数据分散情况资料的统计图,因形状如箱子而得名。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比 较。它能显示出一组数据的最大值、最小值、中位数、及上下四分位数。

1
2
3
from sklearn.datasets import load_iris
iris = load_iris()['sepal width']
sns.boxplot(x=iris['target'],y=iris['data'][...,1])

四、jointplot( )

seaborn.jointplot(x, y, data=None, kind=‘scatter’, stat_func=None, color=None, height=6, ratio=5, space=0.2, dropna=True, xlim=None, ylim=None, joint_kws=None, marginal_kws=None, annot_kws=None, **kwargs)

4.1 散点图 + 分布图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
rs = np.random.RandomState(2)
df = pd.DataFrame(rs.randn(200,2), columns = ['A','B'])

sns.jointplot(
x=df['A'], y=df['B'], #设置xy轴,显示columns名称
data = df, #设置数据
color = 'b', #设置颜色
s = 50,edgecolor = 'w',linewidth = 1,#设置散点大小、边缘颜色及宽度(只针对scatter)
kind = 'scatter',#设置类型:'scatter','reg','resid','kde','hex'
space = 0.1, #设置散点图和布局图的间距
height = 8, #图表大小(自动调整为正方形))
ratio = 5, #散点图与布局图高度比,整型
marginal_kws = dict(bins=15, rug =True), #设置柱状图箱数,是否设置rug
)

4.2 六边形图
1
2
3
4
5
6
7
8
9
sns.jointplot(
x=df['A'], y=df['B'], #设置xy轴,显示columns名称
data = df, #设置数据
color = 'grey', #设置颜色
kind = 'hex',#设置类型:'scatter','reg','resid','kde','hex'
space = 0.1, #设置散点图和布局图的间距
height = 8, #图表大小(自动调整为正方形))
ratio = 5, #散点图与布局图高度比,整型
)

4.3 密度图
1
2
3
4
5
6
7
8
9
10
11
12
13
#创建数据
rs = np.random.RandomState(15)
df = pd.DataFrame(rs.randn(300,2), columns = ['A', 'B'])
#创建密度图
g = sns.jointplot(
x = df['A'], y = df['B'],
data = df,
kind = 'kde',
color = 'k',
shade_lowest = False
)
#添加散点图
g.plot_joint(plt.scatter, c = 'w', s = 30, linewidth = 1, marker='+')

五、heatmap( )

热力图可以体现数据集中特征的两两关系。简单地说,可以反应协方差矩阵。

seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt=‘.2g’, annotkws=None, linewidths=0, linecolor=‘white’, cbar=True, cbarkws=None, cbar_ax=None, square=False, ax=None, xticklabels=True, yticklabels=True, mask=None, **kwargs)

1
2
3
data = np.random.rand(10, 12)
# annot设置数字显示,linewidths设置小方格之间的线宽,vmin和vmax设置上下界
sns.heatmap(data,annot=True,linewidths=0.5,vmin=0,vmax=1)

六、pairplot( )

seaborn.pairplot(data, hue=None, hue_order=None, palette=None, vars=None, x_vars=None, y_vars=None, kind=‘scatter’, diag_kind=‘auto’, markers=None, height=2.5, aspect=1, dropna=True, plot_kws=None, diag_kws=None, grid_kws=None, size=None)

6.1 普通矩阵图示意
1
2
3
4
5
6
7
8
9
10
iris = sns.load_dataset('iris')
sns.pairplot(
iris,
kind = 'scatter', #散点图/回归分布图{'scatter', 'reg'})
diag_kind = 'hist', #直方图/密度图{'hist', 'kde'}
hue = 'species', #按照某一字段进行分类
palette = 'husl', #设置调色板
markers = ['o', 's', 'D'], #设置不同系列的点样式(这里根据参考分类个数)
height = 2 #图标大小
)

6.2 提取局部变量进行对比
1
2
3
4
5
6
7
8
sns.pairplot(
iris,
vars = ['sepal_width', 'sepal_length'],
kind = 'reg',
diag_kind = 'kde',
hue = 'species',
palette = 'husl'
)

七、violinplot()

violinplot与boxplot扮演类似的角色,它显示了定量数据在一个(或多个)分类变量的多个层次上的分布,这些分布可以进行比较。不像箱形图中所有绘图组件都对应于实际数据点,小提琴绘图以基础分布的核密度估计为特征。具体用法如下:

seaborn.violinplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, bw=‘scott’, cut=2, scale=‘area’, scale_hue=True, gridsize=100, width=0.8, inner=‘box’, split=False, dodge=True, orient=None, linewidth=None, color=None, palette=None, saturation=0.75, ax=None, **kwargs)

7.1 小提琴图指定类别
1
2
3
4
5
6
7
8
9
10
11
12
13
tips = sns.load_dataset('tips')
sns.violinplot(
x = 'day', y = 'total_bill', # x,y轴名字
data = tips,
linewidth = 2, #线宽
width = 0.8, #箱之间的间隔比例
palette = 'hls', #设置调色板
order = {'Thur', 'Fri', 'Sat','Sun'}, #筛选类别
scale = 'count', #测度小提琴图的宽度: area-面积相同,count-按照样本数量决定宽度,width-宽度一样
gridsize = 50, #设置小提琴图的平滑度,越高越平滑
inner = 'box', #设置内部显示类型 --> 'box','quartile','point','stick',None
#bw = 0.8 #控制拟合程度,一般可以不设置
)

7.2 小提琴图通过hue分类
1
2
3
4
5
6
7
8
sns.violinplot(
x = 'day', y = 'total_bill',
data = tips,
hue = 'smoker',
palette = 'muted',
split = True, #设置是否拆分小提琴图
inner = 'box'
)