当前位置: 代码迷 >> 综合 >> Python数据分析与机器学习实战<五>Seaborn
  详细解决方案

Python数据分析与机器学习实战<五>Seaborn

热度:61   发布时间:2023-11-29 21:49:14.0

目录

简介

  整体布局风格设置

5种主题

每个风格如下图所展示

* whitegrid

* darkgrid

?* dark

* white

* ticks

风格细节设置

sns.despine()

画子图时风格可以不同

sns.set_context() :

"paper"

"talk"

 "poster"

"notebook"

调色板

离散型色板

分类色板

圆形画板

hls_palette()函数来控制颜色的亮度和饱和度

l- 亮度 lightness

s- 饱和 saturation

调色板颜色设置

使用xkcd颜色来命名颜色

连续画板

 cubehelix_palette()调色板

light_palette()和dark_palette()调用定制连续调色板

单变量分析绘图

直方图

数据分布情况 

生成数据

两个变量

散点图

sns.jointplot()

"hex"图 

sns.pairplot()

  回归分析绘图

regplot()

 多变量分析绘图

sns.stripplot(x,y,data)

sns.swarmplot() 

盒图 

sns.violinplot()小提琴图

图的套用

分类属性绘图 

条形图

sns.barplot()

点图 

sns.pointplot()

宽型数据 

盒图横着画

 多层面板分类图

sns.factorplot()

 Facetgrid使用方法

  Facetgrid绘制多变量

 热度图的绘制


简介

 Seaborn是一个在matplotlib库的基础上封装的另一个库。提供了很多模板,只需一两行代码就能画出一个很漂亮的图,更加方便。

使用之前,先安装:pip install seaborn

import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 最后一行是在jupyter中需要写的,在pycharm中去掉即可
%matplotlib inline # 让图可以直接显示在notebook上

  整体布局风格设置

# 用plt作图
def sinplot(flip=1):x = np.linspace(0,14,100)# 在0到14上找出100个点for i in range(1,7):# 画六条线plt.plot(x,np.sin(x+i * .5) * (7-i) * flip)
sinplot()

# seaborn有模板可以直接调动
sns.set()# seaborn默认的一些组合
sinplot()

 

5种主题

每个风格如下图所展示

* whitegrid

# 设置风格,可以传入上面的5种风格之一
sns.set_style("whitegrid")
data = np.random.normal(size = (20,6))+ np.arange(6)/2
sns.boxplot(data = data)

 

np.random.normal()的意思是一个正态分布

numpy.random.normal(loc=0,scale=1e-2,size=shape) 

参数loc(float):正态分布的均值,对应着这个分布的中心。

loc=0说明这一个以Y轴为对称轴的正态分布,参数scale(float):正态分布的标准差,对应分布的宽.scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦。

参数size(int 或者整数元组):size=(1,2)/size=2,默认为None。

* darkgrid

sns.set_style("darkgrid")
sinplot()


* dark

sns.set_style("dark")
sinplot()

 

* white

sns.set_style("white")
sinplot()

 

* ticks

sns.set_style("ticks")
sinplot()

风格细节设置

sns.despine()

sinplot()
# 默认值:去掉上面和右面的刻度线
sns.despine()

 

sns.violinplot(data)
sns.despine(offset=10)# offset:距轴线10刻度远

 

sns.set_style("whitegrid")
sns.boxplot(data = data,palette="deep")
sns.despine(left=True)# 隐藏左边的轴线

画子图时风格可以不同

# 指定with域内是一个风格,外可以是另一种风格
with sns.axes_style("darkgrid"):plt.subplot(211)sinplot()
plt.subplot(212)
sinplot(-1)

sns.set_context() :

"paper"

sns.set()
sns.set_context("paper")
plt.figure(figsize=(8,6))
sinplot()

"talk"

sns.set_context("talk")
plt.figure(figsize=(8,6))
sinplot()

 "poster"

sns.set_context("poster")
plt.figure(figsize=(8,6))
sinplot()

"notebook"

# font_scale:字体大小,linewidth:线的粗细
sns.set_context("notebook",font_scale=1.5,rc={"lines.linewidth":3.5})
sinplot()

调色板

* 颜色很重要

* color_palette():能传入任何Matplotlib所支持的颜色

* color_palette():不传参数则默认颜色

* set_palette():设置所有图的颜色

离散型色板

分类色板

import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
sns.set(rc={"figure.figsize":(6,6)})# 画板大小# 默认颜色 10个
current_palette = sns.color_palette()
sns.palplot(current_palette)

圆形画板

当你需要超过10种颜色时,最简单的方法就是在一个圆形的颜色空间中画出均匀间隔的颜色(这样的色调会保持亮度和饱和度不变)。这是大多数的使用比默认颜色循环中设置的颜色 更多时的默认方案。

最常用的是使用“hls”的 颜色空间,这是RGB值得一个简单转换。

sns.palplot(sns.color_palette("hls", 14))

data = np.random.normal(size=(20,14)) + np.arange(14) / 2
sns.boxplot(data=data,palette=sns.color_palette("hls",14))
# 与上面的颜色一一对应

hls_palette()函数来控制颜色的亮度和饱和度

l- 亮度 lightness

s- 饱和 saturation

sns.palplot(sns.hls_palette(14,l=.3,s=.8))

sns.palplot(sns.color_palette("Paired",8))
# 颜色一深一浅成对儿出现

 应用:例如有好多国家参加比赛,每个国家有两个运动员,这两个运动员就可以用一深一浅的同一个色系表示,

调色板颜色设置

使用xkcd颜色来命名颜色

xkcd包含了一套众包努力的针对随机RGB颜色的命名。产生了954个可以随时通过xkcd_rgb字典中调用的命名颜色。

plt.plot([0,1],[0,1],sns.xkcd_rgb["pale red"],lw=3)
plt.plot([0,1],[0,2],sns.xkcd_rgb["medium green"],lw=5)
plt.plot([0,1],[0,3],sns.xkcd_rgb["denim blue"],lw=7)

 指定一个固定的颜色。颜色的命名可以查看官方文档。

连续画板

色彩随着数据变,比如,数据越重要,颜色越深

sns.palplot(sns.color_palette("Blues"))

 默认颜色由浅到深

如果有深入浅,在面板名称后加_r后缀

sns.palplot(sns.color_palette("BuGn_r"))

 cubehelix_palette()调色板

色调线性变换

sns.color_palette("cubehelix",8)

 还可以自己指定色调区间

sns.palplot(sns.cubehelix_palette(8,start=.5,rot=-.75))

light_palette()和dark_palette()调用定制连续调色板

sns.palplot(sns.light_palette("green"))
# 如图1
sns.palplot(sns.dark_palette("green"))
# 如图2
sns.palplot(sns.light_palette("navy", reverse=True))
# reverse=True:颜色由深到浅 如图3

 

x,y=np.random.multivariate_normal([0,0],[[1,-.5],[-.5,1]],size=300).T
pal = sns.dark_palette("green",as_cmap=True)
sns.kdeplot(x,y,cmap=pal)

 

 从里到外-->颜色从浅到深

 实际画图时,没必要自己指定颜色空间,使用默认的即可,所以这里不在演示指定颜色空间

单变量分析绘图

直方图

%matplotlib inline
import seaborn as sns
import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as pltsns.set(color_codes=True)
np.random.seed(sum(map(ord,"distributions")))
# 随机生成一个高斯数据
x=np.random.normal(size=100)
sns.distplot(x,kde=False)
# 接近一个高斯分布

sns.distplot(x,bins=20,kde=False)# 将当前数据切分成20小块

 

数据分布情况 

x=np.random.gamma(6,size=200)
sns.distplot(x,kde=False,fit=stats.gamma)
# fit传进当前要统计的指标

 distplot()中能传入很多参数

根据均值和协方差生成数据。协方差:协方差在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。

生成数据

mean, cov = [0,1],[(1,.5),(.5,1)]
# 指定均值和协方差,生成200个数据
data = np.random.multivariate_normal(mean,cov,200)
df = pd.DataFrame(data,columns=["x","y"])#转换成pandas中的DataFrame结构
df

 观测单个变量的特征时,用直方图;观察两个变量的之间的分布关系最好用散点图

两个变量

散点图

sns.jointplot()

sns.jointplot(x="x",y="y",data=df)

"hex"图 

当数据量大时,用hex图比较好看,另外风格可以是上面说的5种风格的任意一种,建议“white”

x,y=np.random.multivariate_normal(mean, cov, 1000).T
# 当数据很多时,点会堆叠在一起,散点图不太好看
# hex图容易看出 那个区域分布的点多
with sns.axes_style("white"):sns.jointplot(x=x,y=y,kind="hex",color="k")

sns.pairplot()

这个函数会绘制出每两个特征的散点图,对角线位置为当前这一个变量的直方图

# 鸢尾花的数据集(seaborn内置的数据集),有四个特征,当然也可以用pandas读入其他数据
iris = sns.load_dataset("iris")
sns.pairplot(iris)

  回归分析绘图

%matplotlib inline
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as pltsns.set(color_codes=True)
np.random.seed(sum(map(ord,"regression")))
# 内置数据集 tips
tips = sns.load_dataset("tips")tips.head()

regplot()

regplot()和lmplot()都可以绘制回归关系,刚开始使用seaborn推荐 regplot(),另一个支持一些更高级的部分,这个以后再说

sns.regplot(x="total_bill",y="tip",data=tips)
<AxesSubplot:xlabel='total_bill', ylabel='tip'>

 多变量分析绘图

sns.stripplot(x,y,data)

%matplotlib inline
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as pltsns.set(style="whitegrid",color_codes=True)np.random.seed(sum(map(ord,"categorical")))
# 下面会用到“泰坦尼克获救人”数据集、“鸢尾花”数据集以及小费数据集
titanic=sns.load_dataset("titanic")
tips=sns.load_dataset("tips")
iris=sns.load_dataset("iris")sns.stripplot(x="day",y="total_bill",data=tips,jitter=True)
# jitter=True:使原本重叠在一起的点随机向左向右偏动,更容易观察

sns.swarmplot() 

sns.swarmplot(x="day",y="total_bill",hue="sex",data=tips)
# 使数据更均匀的分布在左右;hue="sex"加上图例
# 另外其他的一些参数也是通用的可以通过官方文档查看具体使用

盒图 

* IQR即统计学概念四分位距,第一/四分位与第三/四分位之间的距离

* N=1.5IQR 如果一个值>Q3+N 或 <Q1-N,则为离群点

sns.boxplot(x="day",y="total_bill",hue="time",data=tips)

盒子下面为1/4,上面为3/4,最上面一横为最大值,同理最下面一横为最小值 ,小菱形为离群点

sns.violinplot()小提琴图

sns.violinplot(x="total_bill",y="day",hue="time",data=tips)

sns.violinplot(y="total_bill",x="day",hue="sex",data=tips,split=True)
# split:True 图的左右两侧各表示一个属性,更直观

 

图的套用

sns.violinplot(y="total_bill",x="day",data=tips,inner=None)
sns.swarmplot(x="day",y="total_bill",data=tips,color="w",alpha=.5)# alpha为透明度

分类属性绘图 

条形图

sns.barplot()

可以用来显示值的集中趋势

sns.barplot(x="sex",y="survived",hue="class",data=titanic)

点图 

sns.pointplot()

可以更好的描绘变化差异

sns.pointplot(x="class",y="survived",hue="sex",data=titanic,palette={"male":"g","female":"m"},markers=["^","o"],linestyles=["-","--"])

宽型数据 

盒图横着画

sns.boxplot(data=iris,orient="h")
# orient="h":横着画

 

 多层面板分类图

sns.factorplot()

sns.factorplot(x="day",y="total_bill",hue="smoker",data=tips)
# 指定kind可以画不同的图,如条形:kind="bar
# sns.factorplot(x="day",y="total_bill",hue="smoker",data=tips,kind="bar)

 还有一些参数如下图所示:(参考)

 Facetgrid使用方法

 Facetgrid是seaborn中一个很重要的函数,当我们想把数据集中很多子集进行展示时,可以用它。

%matplotlib inline
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plttips=sns.load_dataset("tips")# 实例化
g = sns.FacetGrid(tips,col="time")
# 开始画图
g.map(plt.hist,"tip");

g = sns.FacetGrid(tips,col="sex",hue="smoker")
g.map(plt.scatter, "total_bill","tip",alpha=.7)
g.add_legend();# 说明smoker用什么颜色,不写这句,没有旁边的小图例

 

 其他参数设置与之前都是类似的

 Facetgrid有一个要求是,传入的数据基本上都是pandas的格式,传参数是,最好都指定成DataFrame的格式(默认支持的格式)用其他就不一定ok了。

# 指定先后顺序
from pandas import Categorical
ordered_days=tips.day.value_counts().index
print(ordered_days)# 原本的顺序
# 可以自己指定一个顺序
ordered_days= Categorical(['Thur', 'Fri', 'Sat', 'Sun'])
g = sns.FacetGrid(tips,row="day",row_order=ordered_days,size=1.7,aspect=4,)
g.map(sns.boxplot,"total_bill");

  Facetgrid绘制多变量

pal = dict(Lunch="seagreen",Dinner="gray")# 指定颜色
g = sns.FacetGrid(tips,hue="time",palette=pal,size=5)
g.map(plt.scatter,"total_bill","tip",s=50,alpha=.7,linewidth=.5,edgecolor="white");
# s为圆圈大小

with sns.axes_style("white"):g = sns.FacetGrid(tips,row="sex",col="smoker",margin_titles=True,size=2.5)
g.map(plt.scatter,"total_bill","tip",color="#334488",edgecolor="white",lw=.5);
g.set_axis_labels("Total bill (US Dollars)","Tip");# 坐标轴的名字
g.set(xticks=[10,30,50],yticks=[2,6,10]);#指定x轴y轴的取值
g.fig.subplots_adjust(wspace=.02,hspace=.02)# 子图之间的间隔

 

iris=sns.load_dataset("iris")# 鸢尾花数据集
g = sns.PairGrid(iris,vars=['sepal_length','sepal_width'],hue="species")# 区分了不同物种颜色
# vars指定选取4个特征中两个特征
g.map_diag(plt.hist)# 对角线画条形图
g.map_offdiag(plt.scatter)#非对角线画散点图
g.add_legend();

 

# palette调色板,根据size(6个)渐变颜色
g = sns.PairGrid(tips,hue="size",palette='GnBu_d')# 区分了不同物种颜色
g.map(plt.scatter,s=50,edgecolor="white")
g.add_legend();

 热度图的绘制

import seaborn as sns
import numpy as np
np.random.seed(0)
import matplotlib.pyplot as pltsns.set()
uniform_data = np.random.rand(3,3)
# 随机生成一个3*3的矩阵
print(uniform_data)
heatmap=sns.heatmap(uniform_data)
# 另外还可以在heatmap中指定调色板的上下线,参数例:vmin=0.2,vmax=0,9
[[0.5488135  0.71518937 0.60276338][0.54488318 0.4236548  0.64589411][0.43758721 0.891773   0.96366276]]

normal_data=np.random.randn(3,3)
print(normal_data)
ax = sns.heatmap(normal_data,center=0)# 指定以0为分界线

 

import seaborn as sns
import numpy as np
np.random.seed(0)
import matplotlib.pyplot as pltsns.set()
# 航班数据
flights = sns.load_dataset("flights")
# flights.head()flights = flights.pivot("month","year","passengers")
print(flights)
ax = sns.heatmap(flights)
year   1949  1950  1951  1952  1953  1954  1955  1956  1957  1958  1959  1960
month                                                                        
Jan     112   115   145   171   196   204   242   284   315   340   360   417
Feb     118   126   150   180   196   188   233   277   301   318   342   391
Mar     132   141   178   193   236   235   267   317   356   362   406   419
Apr     129   135   163   181   235   227   269   313   348   348   396   461
May     121   125   172   183   229   234   270   318   355   363   420   472
Jun     135   149   178   218   243   264   315   374   422   435   472   535
Jul     148   170   199   230   264   302   364   413   465   491   548   622
Aug     148   170   199   242   272   293   347   405   467   505   559   606
Sep     136   158   184   209   237   259   312   355   404   404   463   508
Oct     119   133   162   191   211   229   274   306   347   359   407   461
Nov     104   114   146   172   180   203   237   271   305   310   362   390
Dec     118   140   166   194   201   229   278   306   336   337   405   432

把值填在对应位置

ax = sns.heatmap(flights,annot=True,linewidths=.5,fmt="d",cmap="YlGnBu")
# d:字体格式(默认显示不清晰)
# 参数:linewidths=.5 :表示每个小格子之间的距离
# cmap:指定调色板
# cbar=False :将颜色的范围显示隐藏(最好不隐藏)