1 简介
Seaborn基于matplotlib,它在matplotlib的基础上进行了更高级的API封装,便于用户可以更加简便地做出各种有吸引力的统计图表。它还能够高度兼容numpy与pandas数据结构以及scipy与statsmodel等统计模式。用更简单的调用呈现更多图表
seaborn官网: http://seaborn.pydata.org/
2 基本设置
- 图表的外部的风格:整个图或者子图,图表的底纹
- 图表的内部的风格:标签、线条和其他
- 颜色的设置
#导入需要的包
import numpy as np
import pandas as pd
import scipy as stats
import matplotlib.pyplot as plt
import seaborn as sns
2.1seaborn绘图初体验
先看一下matplotlib绘图效果
def sinplot(flip = 1):
x = np.linspace(0,14,100)
for i in range(1,7):
plt.plot(x,np.sin(x+i*0.5)*(7-i)*flip)
plt.figure(figsize = (6,4))
sinplot()
plt.show()
再来看看seaborn绘图效果
#seaborn.set(context = 'rotebook',style = 'darkgrid',palette = 'deep',font = 'sans-serif',
font_scale = 1,color_codes = True,rc = None)
#set()函数可以设置背景色、风格、字型、字体等
sns.set() #参数非常多,一般不用
plt.figure(figsize = (6,4))
sinplot()
plt.show()
两者直接形成对比,seaborn生成的图片色彩柔和,直接生成灰色背景、白色网格。
2.2图表风格
set_style() seaborn提供了5种默认的风格
- darkgrid/whitegrid(深色带格子/白色带格子):更关注数值
- dark/white:更关注整体趋势
- ticks:强化刻度
sns.set_style('whitegrid')
plt.figure(figsize = (6,4))
sinplot()
plt.show()
#整个图的风格
sns.set_style('white')
plt.figure(figsize = (6,4))
sinplot()
plt.show()
2.3 图表坐标轴
seaborn.despine(fig = None,ax = None, top = True, rigth = True, left = False, bottom = False,offset = None, trim = False) top,right,left,bottom:布尔型,为True时不显示
offset: 与坐标轴之间的偏移
trim: 为True时,将坐标轴限制在数据的最大最小值之间
#设置风格
sns.set_style('white')
plt.figure(figsize = (6,4))
sinplot()
sns.despine(top = True,right = True) #删除了上坐标轴、右坐标轴
plt.show()
#设置风格
sns.set_style('white')
plt.figure(figsize = (6,4))
sinplot()
sns.despine(top = True,right = True,offset=20) #删除了上坐标轴、右坐标轴,offset参数可以调节分离坐标轴
plt.show()
2.4 设置局部图表风格
axes_style() 与with配合的用法,设置不同的子图使用不同的风格
plt.figure(figsize = (6,4))
with sns.axes_style('darkgrid'): #设置第一个子图的风格
plt.subplot(211)
sinplot()
with sns.axes_style('whitegrid'): #设置第二个子图的风格
plt.subplot(212)
sinplot()
2.5 设置内容风格
set_context(),包括paper\notebook\talk 演讲\poster 海报 设置绘图背景参数的,它主要来影响标签、线条和其他元素的效果,但不会影响整体的风格
sns.set_style('white') #图表风格
sns.set_context('poster') #设置图表里面的内容,标签,线条和其他元素
sinplot()
plt.show()
3 数据集分布的可视化
3.1 单变量分布图
一个特征,比如:年龄
3.1.1 直方图
sns.set_style('white') #图表风格
sns.set_context('talk') #设置图表里面的内容,标签,线条和其他元素
np.random.seed(29)
x = np.random.normal(size = 1000)
#通过kernel density estimate(KDE)核密度估计计算出的概率密度函数
#kde:True 拟合出概率密度曲线;rug:True x轴上点上数据;norm_hist 为True 纵轴是概率,为False纵轴是 频率
#bins:设置柱子数量
sns.distplot(x,bins = 50,kde = False,rug = True,color = 'r',norm_hist = True)
plt.show()
sns.distplot(x,hist = False,rug = False,color = 'r',norm_hist = True) #只绘制概率密度曲线
plt.show()
3.1.2 拟合参数分布
#当数据越来越多时,拟合曲线与标准的gamma分布越接近
x = np.random.gamma(6,size = 200) # gamma 分布数据
sns.displot(x,bins = 100,kde = True, color = 'r', fit = stats.gamma); #拟合分布
3.1.3
sns.rugplot(x,height = 0.2,color = 'r',alpha = 0.9)
plt.show()
3.2 双变量分布图(二元)
#数据集
mean,cov = [0,1],[(1,0.5),(0.5,1)]
data = np.random.multivariate_normal(mean,cov,200)
df = pd.DataFrame(data,columns = ['x','y'])
df.head()
3.2.1 散点图
sns.jointplot(x = 'x',y = 'y',data = df)
plt.show()
3.2.2 Hexbin图(六边形分箱图
x,y = np.random.multivariate_normal(mean,cov,1000).T
with sns.axes_style('white'):
#可以指定什么形状(hex六角形)
sns.jointplot(x = x,y=y,kind= 'hex',color = 'r')
#颜色越深代表点数越多
plt.show()
3.2.3 核密度估计
sns.jointplot(x = x,y=y ,kind= 'kde',coloc = 'b')
plt.show()
3.3 可视化数据集中成对的关系
3.3.1 矩阵散点图 - pairplot
iris=pd.read_csv(r".\data\iris.csv")
iris.head() #150个样本4列,3种类别
#绘制图形中共6种,其余对称关系,中间的是自己和自己,故用直方图表示
sns.pairplot(iris);# 默认对角线hist,非对角线scatter
plt.show()
#通过kind画不同的图,diag_kind 对角线类型
sns.pairplot(iris,hue="species",diag_kind='hist');
plt.show()
#属性两两间的关系 + 属性的灰度图
g = sns.PairGrid(iris)
g.map_diag(sns.kdeplot) # 对角线单个属性图
g.map_offdiag(sns.kdeplot, cmap="Blues_d", n_levels=20) # 非对角线两个属性关系图
plt.show()
3.3.2 矩阵散点图 - PairGrid
sns.set_context('notebook')
g = sns.PairGrid(iris)
g.map(plt.scatter)
plt.show()
g = sns.PairGrid(iris,hue = "species")
g.map_diag(plt.hist) #对角线 直方图
g.map_offdiag(plt.scatter) #非对角线 散点图
g.add_legend()
plt.show()
3.3.3 分类散点图—— stripplot
df = pd.DataFrame({'total_bill':np.random.randint(20,30,210),
'sex':['女']*60+['男']*150,
'day':['Mon','Tues','Wed','Thur','Fri','Sat','Sun']*30})
#按照不同类别对样本数据进行分布散点图绘制
sns.stripplot(
x = 'day', #分组统计字段
y = 'total_bill', #数据分布统计字段
#对xy数据对调,将会使得散点图横向分布
data = df, #对应数据
jitter = 0.1,
size = 10,edgecolor = 'w',linewidth = 1,marker = 'o'
)
plt.show()
#通过hue参数再分类
sns.stripplot(x = 'day', #分组统计字段
y = 'total_bill', #数据分布统计字段
hue = 'sex',
#对xy数据对调,将会使得散点图横向分布
data = df, #对应数据
jitter = True)
plt.show()