(十四)Seaborn知识学习1-python数据分析与机器学习实战(学习笔记)

文章原创,最近更新:2018-05-10

1.Seaborn的介绍
2.整体布局风格设置
3.风格细节设置
课程来源: python数据分析与机器学习实战-唐宇迪

学习参考链接:
1、Seaborn(sns)官方文档学习笔记(第一章 艺术化的图表控制)
2、Seaborn官方0.8.1版本

1.Seaborn的介绍

1.1Seaborn的基本了解

Seaborn作为一个带着定制主题和高级界面控制的Matplotlib扩展包,能让绘图变得更轻松.

Matplotlib即便是非常简单的流程,都要好几行的代码,很多人都希望对于统计的图,在Matplotlib上进行封装,调用模版就可以传数据,就可以把图画出来.然而Seaborn就为了我们做这样的事.

Seaborn在Matplotlib进行了封装,底层还是Matplotlib,区分就是提供了非常丰富的模版,在绘图的时候,比如条形图/柱形图/折线图等都提供了模版,只需要提供很简单的1-2行代码就可以完成这样的任务.

1.2Seaborn的安装

在cmd输入:pip install seaborn

2.整体布局风格设置

本部分主要介绍seaborn是如何对matplotlib输出的外观进行控制的。

2.1传统的matplotlib和seaborn的不同

定义一个含偏移的正弦图像,来比较传统的matplotlib和seaborn的不同:

第一段代码涉及到的知识点:
1)numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)[source]

  • start是采样的起始点
  • stop是采样的终点
  • num是采样的点个数
    例如:a=np.linspace(-1,1,num=5)
    输出如下:
    [-1. -0.5 0. 0.5 1. ]

第二段代码涉及到的知识点:
2)sns.set()
要切换到seaborn默认值,只需调用该.set()函数即可。

传统的matplotlib,完整的代码如下:

import numpy as np
import matplotlib.pyplot as plt

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)
        
sinplot()

输出的结果如下:


seaborn完整的代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

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)

sns.set()
sinplot()

输出的结果如下:


传统的matplotlib和seaborn的区别:
seaborn默认的灰色网格底色灵感来源于matplotlib却更加柔和。大多数情况下,图应优于表。seaborn的默认灰色网格底色避免了刺目的干扰,对于多个方面的图形尤其有用,是一些更复杂的工具的核心。

2.2seaborn 5种主题风格

有5个seaborn的主题,适用于不同的应用和人群偏好:

  • darkgrid 黑色网格(默认)
  • whitegrid 白色网格
  • dark 黑色背景
  • white 白色背景
  • ticks 应该是四周都有刻度线的白背景.

现在看一下这五种主题风格画完之后长什么样子的?

2.2.1whitegrid 白色网格

这里涉及到的知识点:
1)set_style()函数

  • 为了控制样式,使用set_style()函数,参数就是5个seaborn的主题。

2)np.random.normal()函数
np.random.normal(mean,stdev,size)
参数的意义为:

  • mean:float,概率分布的均值,对应着整个分布的中心center
  • stdev:float,概率分布的标准差,对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高
  • size:int or tuple of ints,输出的shape,默认为None,只输出一个值
    我们更经常会用到np.random.randn(size)所谓标准正太分布(μ=0, σ=1),对应于np.random.normal(mean=0, stdev=1, size)


完整的代码如下

import seaborn as sns
import numpy as np

sns.set_style("whitegrid")
data=np.random.normal(size=(20,6))+np.arange(6)/2
sns.boxplot(data=data)

输出的结果如下:



从输出的结果来看,背景是白色的,竖的刻度都有横条,可以知道绘制图像对应的刻度,这就是whitegrid风格,比较常用的一种风格.

2.2.2 dark 黑色背景

对于许多场景,(特别是对于像对话这样的设置,您主要想使用图形来提供数据模式的印象),网格就不那么必要了

完整的代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

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)

sns.set_style("dark")
sinplot()

输出的结果如下:



从输出的结果可以看出,背景是深色的,刻度没有横线.

2.2.3 white 白色背景

完整的代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

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)

sns.set_style("white")
sinplot()

输出的结果如下:



从输出的结果可以看出,背景是白色的,刻度没有横线.

2.2.4 ticks

从white主题输出的结果可以看出,x,y轴对应的只有一条线,线上是没有刻度的,有时候为了使制图后看数据更加精确一下,需要加上刻度,这就是ticks风格.

完整的代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

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)

sns.set_style("ticks")
sinplot()

输出的结果如下:


从输出的结果可以看出,ticks风格是x,y轴线都有刻度.

2.2.5其他

当我们想用这些风格的时候,也可以指定一些其他的参数.

比如ticks风格的绘图中,去掉上方和右方的线,可以用以下代码表示:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

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)

sns.set_style("ticks")
sinplot()
sns.despine()

输出的结果如下:



从图片来看,上方和右方的线去掉了,我们可以根据风格主题,再定制主题.

这里涉及的知识点:
1)sns.despine()
seaborn中通过despine()函数轻松删除上方和右方的边框.

3.风格细节设置

3.1边框移位

当我们指定画风的时候,可以指定画图与轴线之间的位置关系.

可以设置sns.despine()中的参数offset,就可以指定画图与轴线之间的距离.

当设置画图与轴线之间的距离为10,完整的代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

sns.set_style("ticks")
data=np.random.normal(size=(20,6))+np.arange(6)/2
f,ax=plt.subplots()
sns.violinplot(data)
sns.despine(offset=10)#offset =10,代表绘制的图分别离x,y轴的距离

输出的结果如下:


当设置画图与轴线之间的距离为100,完整的代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

sns.set_style("ticks")
data=np.random.normal(size=(20,6))+np.arange(6)/2
f,ax=plt.subplots()
sns.violinplot(data)
sns.despine(offset=100)#offset =100,代表绘制的图分别离x,y轴的距离

输出的结果如下:


这里涉及的知识点:
1)sns.despine()
seaborn中通过despine()函数轻松删除上方和右方的边框,也可以移位,当边框没有覆盖整个数据轴的范围的时候,trim参数会限制留存的边框范围。
比如:sns.despine(offset=10, trim=True); # offset 两坐标轴离开距离.

3.2边框删除

这里用.despine()控制边框的删除

1)在默认的情况下,边框的位置是上方,下方,左右方均是有边框的.
完整的代码如下:

import seaborn as sns
import numpy as np
sns.set_style("whitegrid")
data=np.random.normal(size=(20,6))+np.arange(6)/2
sns.boxplot(data=data,palette="deep")

输出的结果如下:


2)去掉上方,右方的边框
完整的代码如下:

import seaborn as sns
import numpy as np
sns.set_style("whitegrid")
data=np.random.normal(size=(20,6))+np.arange(6)/2
sns.boxplot(data=data,palette="deep")
sns.despine()

输出的结果如下:


3)去掉上方,左方,右方的边框
完整的代码如下:

import seaborn as sns
import numpy as np
sns.set_style("whitegrid")
data=np.random.normal(size=(20,6))+np.arange(6)/2
sns.boxplot(data=data,palette="deep")
sns.despine(left=True)

输出的结果如下:


这里涉及的知识点:
1)sns.despine()
despine(fig=None, ax=None, top=True, right=True, left=False, bottom=False, offset=None, trim=False)
从plot()函数中移除顶部或右边的边框

3.3临时设定图形样式

同一画布子图的时候,每个子图的风格不一样,那指定多个风格的时候,应该怎么操作?

虽然来回切换非常容易,但sns也允许用with语句中套用axes_style()达到临时设置参数的效果(仅对with块内的绘图函数起作用)。这也允许创建不同风格的坐标轴。

完整的代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

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)

f, ax = plt.subplots()
with sns.axes_style("darkgrid"):
    plt.subplot(2,1,1)
    sinplot()
sns.set_style("whitegrid")
plt.subplot(2,1,2)
sinplot(-1)

输出的结果如下:

从输出的结果可以看出,两个绘图最终的结果不一样,上面的风格是"darkgrid",下面的风格是"whitegrid".

这里涉及的知识点:
为了控制样式,使用axes_style()和set_style()函数.axes_style()是临时控制样式.

3.5调整绘图元素

控制绘图元素的规模,即就是绘制图大小的风格,有四种预设,按相对尺寸的顺序(线条越来越粗),分别是paper,notebook, talk, and poster。notebook的样式是默认的,上面的绘图都是使用默认的notebook预设。

通过set_context() 调整绘图元素,具体如下:

  • paper

完整的代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

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)

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

输出的结果如下:


  • notebook (default 默认设置)

完整的代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

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)

sns.set_style("darkgrid")
sns.set_context("notebook")
plt.figure(figsize=(8,6))
sinplot()

输出的结果如下:


  • talk

完整的代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

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)

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

输出的结果如下:

  • poster

完整的代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

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)

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

输出的结果如下:


  • 其他
    sns.set_context()中的参数,font_scale可以设置刻度标签的字体的大小,lines.linewidth可以设置折线的宽度

完整的代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

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)

sns.set_style("darkgrid")
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
plt.figure(figsize=(8,6))
sinplot()

涉及的相关知识点:
使用其中一个名称来调用set_context()来设置参数,您可以通过提供参数值的字典来覆盖参数。
通过更改context还可以独立地扩展字体元素的大小。(这个选项也可以通过顶级set()函数获得)。

你可能感兴趣的:((十四)Seaborn知识学习1-python数据分析与机器学习实战(学习笔记))