美文网首页呆鸟的Python数据分析python数据分析与机器学习实战我爱编程
(十四)Seaborn知识学习1-python数据分析与机器学习

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

作者: 努力奋斗的durian | 来源:发表于2018-05-10 12:27 被阅读159次

    文章原创,最近更新: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()函数获得)。

    相关文章

      网友评论

      • 知识学者:好厉害啊:joy: ,点赞
        努力奋斗的durian:谢谢你的提醒哦,有些代码还真的不全,不是你的问题哦.因为有些时候代码迭代使用了,之前有使用过,导致运行的时候居然也没报错.最近几篇的文章都有写完后,检查一遍代码,等我有空了,把之前写的代码也排查一下.
        努力奋斗的durian:只是学习笔记而已啦.你认真看视频你也可以的~

      本文标题:(十四)Seaborn知识学习1-python数据分析与机器学习

      本文链接:https://www.haomeiwen.com/subject/nswarftx.html