美文网首页Matplotlib
matplotlib 数据可视化 - 入门概念

matplotlib 数据可视化 - 入门概念

作者: 东南有大树 | 来源:发表于2018-11-26 14:54 被阅读10次

    matplotlib 架构

    matplotlib 的架构分为以下三层

    • Scripting (脚本)层
    • Artist (表现)层
    • Backend (后端)层

    它们之间的访问关系是:

    Scripting 访问 Artist, Artist 访问 Backend

    各层级的作用

    Backend 为最底层,即 matplotlib API 层,包含的元素有:

    • FigureCanvas 对象实现了绘图区的概论
    • Renderer 对象在FigureCanvas 上绘图
    • Event 对象处理用户输入(键盘和鼠标事件)

    Artist 层拥有许多可视化元素,即标题、轴标签、刻度等元素。Aitist 类分为两种:原始(primitive)和复合(composite),即单元素的使用和多元素组合使用。

    • Figure
      • Axes
        • Text
        • Y-axis
          • Y-ticks
          • Y-label
        • X-axis
          • X-label
          • X-ticks
        • Line2D

    Artist 最上层是 Figure 层,表示图形概念; Axes 在 Figure 上面,表示轴的作图的内容(即轴对象),每个维度会有一个 Axes 对象;Axis 用来展示 Axes 上的数值(即刻度与刻度值),刻度的位置用 Locator 对象管理,刻度的标签的格式用 Formatter 对象调整。

    Scripting 层包含 pylabpylot 模块,这将是重点学习的内容,不过 pylab 暂不介绍

    使用 pylot 生成一幅简单的交互式图像

    '''首先导入pylot模块'''
    import matplotlib.pyplot as plt
    '''调用plot()函数'''
    plt.plot([1, 2, 3, 4])
    '''调用show()函数,显示图像'''
    plt.show()
    
    output_2_0.png

    注意,如果是在QtConsole环境中时,不用show()函数也可以显示图像

    解析:

    plot()函数需要知道x、y值的对应关系,才能画出图像,上例中只传入了一个列表,plot会将其当作y的值,而x的值会默认取0、1、2……的递增数值与y值进行对应,便形成了上图的结果

    下面,我们为plot()分别指定x与y的值

    plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7])
    plt.show()
    
    output_5_0.png

    线条的默认颜色是蓝色的,可以尝试改变它的颜色:

    plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7], 'red')
    plt.show()
    
    output_7_0.png

    好了,从上面的例子,已经摸索出:第一个参数的列表表示x轴的数据,第二个参数的列表表示y轴的数据,第三个参数表示的是线条的颜色可。

    另外,观察到,x/y轴的刻度值是随着数据自动匹配的,那如何手动匹配呢?可使用axis()函数来设定刻度的范围:

    plt.axis([0,8,0,10])
    plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7], 'red')
    plt.show()
    
    output_9_0.png

    可以看到,线条的形状不变,但它所在的位置发生了变化,因为刻度变了,axis()中的参数是个列表,列表[xmin, xmax, ymin, ymax]中的元素分别指定x轴的最小与最大值,y轴的最小与最大值。

    顺便说一下,title()函数可以为图表添加标题:

    plt.axis([0,8,0,10])
    plt.title('我的标题')
    plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7], 'red')
    plt.show()
    
    output_11_0.png

    x和y轴数据虽然可以传入列表,实际上在使用的时候会被转换成numpy类型,所以可以直接传入numpy类型作参数,效率会更高。

    另外再提一下,第三个参数除了可以指定颜色外,还可以指定画图像的形状:

    plt.axis([0,8,0,10])
    plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7], 'ro')
    plt.show()
    
    output_13_0.png
    '''导入math和numpy'''
    import math
    import numpy as np
    
    '''生成0到2.5,间隔为0.1的数列'''
    t = np.arange(0,2.5,0.1)
    '''
    math.pi指圆周率,这里将t中的所有元素乘以圆周率后,
    依次作用于math.sin函数上,并返回一个可迭代序列
    '''
    y1 = list(map(math.sin,math.pi*t))
    '''用法同上,只是将t乘以圆周率的值再加上math.pi/4的值,表示偏移量'''
    y2 = list(map(math.sin,math.pi*t+math.pi/4))
    '''用法同上,这里的偏移量是负数'''
    y3 = list(map(math.sin,math.pi*t-math.pi/4))
    '''画图'''
    plt.plot(t,y1,'b*',t,y2,'g^',t,y3,'ys')
    plt.show()
    
    output_14_0.png

    解析:

    来看一下plot()的使用语法

    Signature: plt.plot(*args, **kwargs)
    Docstring:
    Plot y versus x as lines and/or markers.
    
    Call signatures::
    
        plot([x], y, [fmt], data=None, **kwargs)
        plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
    
    The coordinates of the points or line nodes are given by *x*, *y*.
    

    其中plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)指出了可以连续使用多个x/y/fmt参数来同时画多个图形。

    根据上例,可得知,fmt参数,第一个字母表示颜色,字母后面的字符表示形状,b*则表示的是蓝色的星号,g^表示的则是绿色的三角,ys表示的是黄色的方块。

    再看个例子:

    plt.plot(t,y1,'b--',t,y2,'r.',t,y3,'g+')
    plt.show()
    
    output_17_0.png

    是不是很奇妙O(∩_∩)O哈哈~

    了解 plot() 的参数

    在上面的例子里,已经看到plot()的语法是plt.plot(*args, **kwargs),可见,可以传入列表与字典类型的参数,列表类型的参数已经在上面的各例中使用过了,那字典类型的参数如何使用呢?

    字典类型的参数又叫关键字参数,又称kwargs,在plot()的使用中,关键字参数一般用来设置相关属性,比如下面的例子中,设置线条的粗细:

    plt.plot(t,y1,linewidth=5.0)
    plt.show()
    
    output_21_0.png

    linewidth相关于key,5.0则是value,能过这种一一对应关系,来指定线条的粗细。

    处理多个 Figure 和 Axes 对象

    这里想表达的是,在一个图形 Figure 中,使用多个图例 Axes;那如何实现呢?先看下例子,然后再作解析:

    t = np.arange(0,5,0.1)
    y1 = np.sin(2*np.pi*t)
    y2 = np.sin(2*np.pi*t)
    plt.subplot(211)
    plt.plot(t,y1,'b-')
    plt.subplot(212)
    plt.plot(t,y2,'r*')
    plt.show()
    
    output_24_0.png

    解析:

    首先生成了x与y的数据

    t = np.arange(0,5,0.1)
    y1 = np.sin(2*np.pi*t)
    y2 = np.sin(2*np.pi*t)
    

    subplot()函数,可以将图形分为不同的绘图区域,参数中的211指的是:按垂直方向分成2份,按水平方向分成1份,当前可被控制的是第1个区域

    plt.subplot(211)
    

    然后对第一个区域进行绘图

    plt.plot(t,y1,'b-')
    

    如果想在第二个图上进行绘图,需要将控制指令切换到第二个区域,使用subplot(212)来指定第三个参数值为2,即控制第二个区域

    plt.subplot(212)
    

    最后,在第二个区域上绘图,并显示所有

    plt.plot(t,y2,'r*')
    plt.show()
    

    接下来再看一下如何将图分成左右两个区域:

    t = np.arange(0,5,0.1)
    y1 = np.sin(2*np.pi*t)
    y2 = np.sin(2*np.pi*t)
    plt.subplot(121)
    plt.plot(t,y1,'b-')
    plt.subplot(122)
    plt.plot(t,y2,'r*')
    plt.show()
    
    output_27_0.png

    相关文章

      网友评论

        本文标题:matplotlib 数据可视化 - 入门概念

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