zoukankan      html  css  js  c++  java
  • Matplotlib绘图及动画总结

    Matplotlib绘图总结

    绘图原理

    block模式(python默认)

    1. plt.polt()等绘图函数不会直接在窗口中绘图,只有调用plt.show()(默认block=True)或plt.pause()(窗口自动关闭)时才将内存中的图绘制到窗口。

    2. 程序碰到第一个plt.show()时,绘图后会暂停执行,直到手动关闭当前窗口才继续执行后面的代码,这就是“阻塞”的含义。

    3. plt.pause(time)函数也能实现窗口绘图(不需要plt.show),但窗口只停留time时间便会自动关闭,然后再继续执行后面代码;plt.pause()会把它之前的所有绘图都绘制在对应坐标系中,而不仅仅是在当前坐标系中绘图;特别要注意的是,plt.pasue(0)将绘制之前的所有图像,且图像窗口不会自动关闭,但程序会停止在该语句所在位置,即使手动关闭窗口也不会继续执行后面的代码。

      # 测试程序
      import numpy as np
      import matplotlib.pyplot as plt
      
      x = np.arange(0, 2 * np.pi, 0.1)
      y1 = np.sin(x)
      y2 = np.cos(x)
      
      plt.figure(1)
      plt.plot(x, y1)
      plt.pause(2)  #在figure(1)上绘制sin曲线,2s后自动关闭窗口
      
      plt.figure(1)
      plt.plot(x, y2)
      plt.pause(2)  #在figure(1)上绘制cos曲线,2s后自动关闭窗口
      

    interactive模式(ipython模式默认)

    1. 开启interactive模式,用plt.ion(),放在绘图之前,关闭该模式用plt.ioff()

    2. 不用plt.show()plt.pause(),只要plt.plot()等语句就能在窗口中绘图,但是,绘图后窗口立马自动关闭,你压根都没法看清楚;可以用plt.pause(time)进行延迟自动关闭时间,需要注意的是如果有多个plt.pause()穿插在不同绘图函数下,那么前面的窗口不会先关闭,会等到最后一个plt.pause()结束后再一起关闭。该模式下要实现同时绘图,且保持,可用plt.pause(0),但程序会结束在该位置,手动关闭窗口也不会继续执行了,因此plt.pause(0)应放在程序最后。

    3. 该模式下,即使用了plt.show()也依然会自动关闭窗口,可在调用plt.show()之前调用plt.ioff()关闭交互模式,恢复到阻塞模式。

      import numpy as np
      import matplotlib.pyplot as plt
      
      plt.ion() #开启interactive模式
      for i in range(100):
          y = np.random.random(size=10)
          #plt.cla() #清除当前图像,若不清除则前面画的图保留
          plt.plot(y) #自动绘图,但窗口会立即消失
          plt.pause(0.1) #用于保持窗口
      plt.ioff() #关闭interactive模式,否则后面的plt.show()也会一闪而过
      plt.show()
      

    深入子图

    知道前面的原理可以满足大多数的需要,但是如果如果想自定义每个图的位置,大小,并从多个角度对数据进行比较、分析,则需要深入子图。

    子图表示

    四元列表:[x,y,width,height], 取值范围都是[0, 1], 约定左下角为原点(0, 0), 右上角为(1, 1)。这些取值均为比例。

    import numpy as np
    import matplotlib.pyplot as plt
    
    ax1 = plt.axes()
    ax2 = plt.axes([0.5, 0.6, 0.2, 0.2])
    plt.show(block=False)
    plt.pause(10)
    
    # 进阶版
    plt.figure(1)
    ax1 = plt.axes()
    plt.pause(2)
    plt.figure(1)
    ax2 = plt.axes([0.5, 0.6, 0.2, 0.2])
    plt.show(block=False)
    plt.pause(10)
    

    子图绘图

    每生成一个子图坐标系,plt就表示当前的子图,调用plt.plot()就是在当前的子图上进行绘图。

    方法一:在一张图上生成多种坐标系
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0, 10) # 在[0, 10]之间均分50个点
    plt.axes([0.1, 0.5, 0.8, 0.4], ylim=(-1.2, 1.2))  #
    plt.grid(True)
    plt.plot(np.sin(x))
    
    plt.axes([0.1, 0.5, 0.8, 0.4], ylim=(-1.2, 1.2))
    plt.grid(True)
    plt.plot(np.cos(x))
    plt.show()
    
    方法二:调用plt.subplot()

    无法绘制比例自定义的子图

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 纵横间隙
    plt.subplots_adjust(hspace=0.3, wspace=0.3)
    for i in range(1, 7):
        # 划分子图,生成一张图
        plt.subplot(2, 3, i)
        # 在当前子图上书写
        plt.text(0.5, 0.5, str((2, 3, i)), fontsize=18, ha='center')
    plt.show()
    
    方法三:子图坐标轴共用

    便于数据的比较、分析

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 返回子图及其坐标轴
    fig, ax = plt.subplots(2, 3, sharex='col', sharey='row')
    for i in range(2):
        for j in range(3):
            ax[i, j].text(0.5, 0.5, str((i, j)), fontsize=18, ha='center')
    plt.show()
    
    方法四:子图不规则

    使用GridSpec方法

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 将一个区域划分为2行3列共6块
    grid = plt.GridSpec(2, 3, wspace=0.5, hspace=0.5)
    plt.subplot(grid[0,0]) # 占第一行第一列一个块
    plt.subplot(grid[0,1:3]) # 占第一行第二、三列2个块
    plt.subplot(grid[1, 0:2]) # 同理
    plt.subplot(grid[1,2]) # 同理
    
    plt.show()
    

    例子

    import numpy as np
    import matplotlib.pyplot as plt
    
    mean = [0, 0]
    cov = [[1, 1], [1, 4]]
    x, y = np.random.multivariate_normal(mean, cov, 3000).T
    plt.figure(figsize=(6, 6))
    grid = plt.GridSpec(4, 4, wspace=0.5, hspace=0.5)
    
    main_ax = plt.subplot(grid[0:3, 1:4])  # 0,1,2 rows, 1,2,3 col
    plt.plot(x, y, 'ok', markersize=3, alpha=0.2)
    
    y_hist = plt.subplot(grid[0:3, 0], xticklabels=[], sharey=main_ax)  # 和大子图共y轴
    plt.hist(y, 60, orientation='horizontal', color='gray')  # 图形水平绘制
    y_hist.invert_xaxis()  # x轴调换方向
    
    x_hist = plt.subplot(grid[3, 1:4], yticklabels=[], sharex=main_ax)  # 和大子图共x轴
    plt.hist(x, 60, orientation='vertical', color='gray')
    x_hist.invert_yaxis()  # y轴调换方向
    
    plt.show()
    

    绘制动画

    方法一:开启交互模式

    缺点无法保存

    import numpy as np
    import matplotlib.pyplot as plt
    
    fig = plt.figure()
    plt.ion()
    ims = []
    for i in range(1, 10):
        im = plt.plot(np.linspace(0, i, 10),
                      np.linspace(0, np.random.randint(i), 10))
        ims.append(im)
        plt.draw()
        plt.pause(0.8)
    plt.ioff()
    
    
    方法二:使用animation

    可生成GIF文件,注意散点图返回对象与其他不同,需调用findobj()返回Artis对象

    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    import numpy as np
    if __name__ == "__main__":
        fig = plt.figure()
        ims = []
        for i in range(1, 10):
            im = plt.plot(np.linspace(0, i, 10),
                          np.linspace(0, np.random.randint(i), 10))
            ims.append(im)
        ani = animation.ArtistAnimation(fig, ims, interval=200, repeat_delay=1000)
        ani.save("test1.gif", writer='pillow')
    
    import matplotlib.animation as animation
    import matplotlib.pyplot as plt
    ims = []
    fig = plt.figure()
    x = np.linspace(0, 10)  # 在[0, 10]之间均分50个点
    plt.plot(x, np.sin(x), color='black')
    for i in range(1, 10):
        im = plt.scatter(i, np.sin(i), color='r').findobj()
        ims.append(im)
    ani = animation.ArtistAnimation(fig, ims, interval=200, repeat_delay=1000)
    ani.save("test2.gif", writer='pillow')
    
    

    参考链接

    https://www.jianshu.com/p/276b7f3ecd4d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    https://blog.csdn.net/qq_28888837/article/details/85778395

    [https://matplotlib.org/api/_as_gen/matplotlib.animation.ArtistAnimation.html?highlight=animation artistanimation](https://matplotlib.org/api/_as_gen/matplotlib.animation.ArtistAnimation.html?highlight=animation artistanimation)

    https://juejin.im/post/5a7c4ab6f265da4e976e7feb

  • 相关阅读:
    sftp 使用笔记
    python-day001获取mac地址
    tomcat 修改端口
    mysql 封装与使用
    redis 封装使用
    centos7安装jenkins
    securecrt设置编码、字体、编码
    linux操作系统上路由管理维护
    ElasticSearch操作和使用指南
    sqlyog连接mysql错误码2058
  • 原文地址:https://www.cnblogs.com/icodeworld/p/11545930.html
Copyright © 2011-2022 走看看