zoukankan      html  css  js  c++  java
  • 使用pyplot和seaborn进行画图

    pyplot的一些知识

    matplotlab中的对象:

    matplotlib是面向对象的,在画图的时候我们了解一些对象,对我们画图是有帮助的。绘图的对象大致分为三层:

    • backend_bases.FigureCanvas : 图表的绘制领域
    • backend_bases.Renderer : 知道如何在FigureCanvas上绘图
    • artist.Artist : 知道如何使用Renderer在FigureCanvas上绘图

    这些是一层一层封装起来的,从底层到高层依次为上面的画布->颜料->画家(canvas->renderer->artist)。但是我们平时画图的时候,基本是使用最上层的封装Artist。我们在画图的时候使用的Figure,Axes,Axis都属于Artist对象。关于这三者的区分是这样的,Figure是我们运行程序后生成的图片,Axes是一个坐标系(最常用的是笛卡尔坐标系,当然还有极坐标系等),我们在这个坐标系上面绘制出我们的图形,Axis是一个坐标轴,比如笛卡尔坐标系中的X轴或者Y轴。

    使用pyplot进行画图:

    当我们进行画图的时候,需要有个figure还有一个axes,假如我们没有指定的话,pyplot会默认为我们指定一个。用plt.plot()进行绘图的时候,默认的是使用当前figure的当前axes进行绘图。

    使用subplot的时候,它返回一个axes供我们画图,subplot传入的前三个参数是nrows,ncols,index。它表示的是我们在一个figure当中有 nrow*ncols个axes,我们使用第index个axes来进行画图。 当这些值均小于10的时候,可以直接将这三个数写为一个三位数。比如plt.subplot(1,2,1) 和 plt.subplot(121)是一样的,都表示创建一行两列个axes,并且返回第第一个axes让我们来画图。

    除了可以指定多个axes以外,还可以指定多个figure, fig1 = plt.figure(1), fig2 = plt.figure(2)等。当number不存在的时候,会创建一个新的figure,当这个number是已经存在的figure.number的时候,它会切换到那个figure。

    总之,pyplot是在当前figure上面的当前axes进行画图的艺术。

    经典的画图的例子是这样的,来自 官网Multiple subplots

    import numpy as np
    import matplotlib.pyplot as plt
    
    x1 = np.linspace(0.0, 5.0)
    x2 = np.linspace(0.0, 2.0)
    y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)
    y2 = np.cos(2 * np.pi * x2)
    
    plt.subplot(2, 1, 1)
    plt.plot(x1, y1, 'o-')
    plt.title('A tale of 2 subplots')
    plt.ylabel('Damped oscillation')
    
    plt.subplot(2, 1, 2)
    plt.plot(x2, y2, '.-')
    plt.xlabel('time (s)')
    plt.ylabel('Undamped')
    
    plt.show()

    上面使用了两个axes,(假如使用fig = plt.figure()会更加的正规)画出的图形是这样的:

    Figure_1

    其实这里主要是让你明白画图的时候figure还有axes的概念,当我们画一个图的时候,总是画在一个特定的figure的特定axes上面。

    plt还有一个subplots方法,返回一个figure还有一组axes,这在我们绘制过个图形当中非常的重要,在本文的最后将会看到例子。

    Seaborn进行画图

    seaborn是基于matplotlib进行的更上一层的封装,如果说matplotlib是将容易的事情变容易,难的事情成为可能,那么seaborn是将难的事情变的容易。下面我将用一些简答的例子来说明seaborn的绘图,更详细的用法可以参考官网的API

    进行数据的准备:

    import seaborn as sns
    from matplotlib import pyplot as plt
    #导入数据
    titanic = sns.load_dataset('titanic')
    #做一些简单的缺失值处理
    titanic = titanic.drop('deck', axis=1)
    titanic['age'].fillna(titanic['age'].median(), inplace=True)
    titanic['embark_town'].fillna(titanic['embark_town'].mode()[0], inplace=True)
    titanic['embarked'].fillna(titanic['embarked'].mode()[0], inplace=True)

    FacetGrid:观察多变量之间的关系

    假如想要观察多变量之间的关系,我们可以使用FacetGrid。

    FacetGrid 可以指定三个和我们想要观察变量有关的变量,看他们对于目标变量的影响情况。row, col, hue分别是行,列,颜色。FacetGrid使用的一般流程是先创建FacetGrid对象,指定data,row,col,hue等信息,然后使用map来进行画图,这期间可以调用pyplot的函数,也可以调用seaborn的函数。

    grid = sns.FacetGrid(titanic, row='pclass', col='survived')
    grid.map(plt.hist, 'age', bins=20)
    plt.show()

    从下面的图片可以看出来,我们要观察在不同的pclass和survived的情况下我们的age分布情况,这个时候,我们可以把survived指定为列,pclass指定为行, 在map函数里面,第一个为指定的函数的绘图方式,后面为该方式所使用的变量,该绘图方式既可以是plt里面的方法,也可以是seaborn里面的方法。

     

    facetgrid

    分类变量

    seaborn提供了很多绘制分类变量的方法,下面介绍一些

    pointplot: 可以进行点图的绘制

    sns.pointplot( x='class',y='age',  data=titanic)
    plt.show()

    pointplot

    countplot:  可以对变量进行计数

    sns.countplot(x='class', hue='sex',  data=titanic)
    plt.show()

    count_plot

    barplot:柱状图,可以看点估计和置信区间

    sns.barplot(x='class', y='age',  data=titanic)
    plt.show()

    barplot

    boxplot 线箱图,可以发现异常值

    sns.boxplot( x='class',y='fare',  data=titanic)

    boxplot

    factorplot 

    factorplot本身是为分类变量准备的,它可以画上面的所有类型的分类变量的图,只需要指定kind类型就可以,包含{point, bar, count, box, violin, strip},默认的情况是点图.

    还有一些函数可以观察多个变量之间的关系

    pairplot 绘制两两变量之间的关系

    sns.pairplot(data=titanic)
    plt.show()

    pairplot

    heatmap 可以展示出变量的相关情况

    sns.heatmap(titanic.corr())
    plt.show()

     这里的一些参数要说明一些:

      cmap:控制数字和色彩对应的参数。使用不同的参数,彩色条是不一样的。

      cbar: 布尔类型,是否设置右边的彩条。

      annot:bool类型或者矩形数据集。是否在显示每个方格的注释(annotate),即里面是不是显示内容。

      annot_kws:配合annot使用,为ax.text的参数。

      square:bool类型,如果为True,那么设置每个方格的大小相等。

      

    heatmap

     

    在一个figure上面绘制多个axes

    上面的绘图情况都是默认使用当前figure的当前axes,并且一个figure上面有一个axes,假如你想要在一个figure上面绘制多个axes的话,可以使用subplots和seaborn函数当中的ax参数

    fig, (ax1, ax2, ax3) = plt.subplots(1,3, figsize=(15,5))
    #我们在这里生成一个fig和三个axes,在下面绘图的时候只需要用ax参数来指定特定的axes就可以了
    sns.barplot(x='class', y='age', data=titanic, ax=ax1)
    sns.countplot(x='sex', data=titanic, ax=ax2)
    sns.distplot(titanic['age'], ax=ax3)
    plt.show()

    multiaxes

     

    参考:

    matplotlib核心概念

    绘图: matplotlib核心剖析

    Python图表绘制:matplotlib绘图库入门

     

  • 相关阅读:
    网络安全协议(1)
    CG-CTF(6)
    CG-CTF(5)
    CG-CTF(4)
    CG-CTF(3)
    MAC地址欺骗(原理及实验)
    CG-CTF(2)
    CG-CTF(1)
    【转载】Spring Boot【快速入门】2019.05.19
    【编程大系】Java资源汇总
  • 原文地址:https://www.cnblogs.com/jiaxin359/p/8604689.html
Copyright © 2011-2022 走看看