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

Matplotlib绘图及动画总结的更多相关文章

  1. matplotlib 绘图

    http://blog.csdn.net/jkhere/article/details/9324823 都打一遍 5 matplotlib-绘制精美的图表 matplotlib 是python最著名的 ...

  2. >炫酷的计时器效果Canvas绘图与动画<

    >炫丽的计时器效果Canvas绘图与动画< 虽然我是学习java的,但是因为最近使用html5的关系,多学习了一下前端知识. 现在,我要介绍的计时器是十分炫酷的,使用画布完成. 喜欢htm ...

  3. 用C#绘图实现动画出现卡屏(运行慢)问题的解决办法

    原文:用C#绘图实现动画出现卡屏(运行慢)问题的解决办法 正在用C#做一个小游戏,需要用到动画,上次解决的问题是闪烁问题,用双缓冲技术.以为不会有什么问题了.后来当把图片全部绘制上去的时候依然出现了卡 ...

  4. python实战学习之matplotlib绘图续

    学习完matplotlib绘图可以设置的属性,还需要学习一下除了折线图以外其他类型的图如直方图,条形图,散点图等,matplotlib还支持更多的图,具体细节可以参考官方文档:https://matp ...

  5. matplotlib绘图的基本操作

    转自:Laumians博客园 更简明易懂看Matplotlib Python 画图教程 (莫烦Python)_演讲•公开课_科技_bilibili_哔哩哔哩 https://www.bilibili. ...

  6. python中利用matplotlib绘图可视化知识归纳

    python中利用matplotlib绘图可视化知识归纳: (1)matplotlib图标正常显示中文 import matplotlib.pyplot as plt plt.rcParams['fo ...

  7. matplotlib绘图基本用法-转自(http://blog.csdn.net/mao19931004/article/details/51915016)

    本文转载自http://blog.csdn.net/mao19931004/article/details/51915016 <!DOCTYPE html PUBLIC "-//W3C ...

  8. python实战学习之matplotlib绘图

    matplotlib 是最流行的Python底层绘图库,主要做数据可视化图表 可以将数据可视化,能够更直观的呈现数据 matplotlib绘图基本要点 首先实现一个简单的绘图 # 导入pyplot f ...

  9. 【原】在Matplotlib绘图中添加Latex风格公式

    Matplotlib绘图的过程中,可以为各个轴的Label,图像的Title.Legend等元素添加Latex风格的公式. 只需要在Latex公式的文本前后各增加一个$符号,Matplotlib就可以 ...

随机推荐

  1. 极客必备 Chrome 浏览器插件

    本文微信公众号「AndroidTraveler」首发. 自己平时使用的最多的就是 Chrome 浏览器,因此本文主要分享自己添加的一些扩展程序. 介绍扩展程序的时候也是以我本人的实际使用为主,有些功能 ...

  2. 软工第八次实验——Git

    hiahiahia我又来作恶了,莫名其妙的第八次实验还要更新! 文章目录 一.Git 1.1 概述 1.1.1 Git 1.1.2 分布式版本控制系统 1.1.3 指令集 1.2 版本控制系统 1.2 ...

  3. CentOS高可用集群LVS+Keepalived(DR模式)

    操作系统:CentOS6.5_x64 mini 负载均衡模式:DR(直接路由) LVS与Keepalived简述: LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是 ...

  4. MySQL常用DDL、DML、DCL语言整理

    DDL ----Data Definition Language 数据库定义语言 如 create procedure之类 创建数据库 CREATE DATABASE [IF NOT EXISTS] ...

  5. [译]Vulkan教程(10)交换链

    [译]Vulkan教程(10)交换链 Vulkan does not have the concept of a "default framebuffer", hence it r ...

  6. 如何开启php错误日志

    nginx与apache不一样,在apache中可以直接指定php的错误日志,那样在php执行中的错误信息就直接输入到php的错误日志中,可以方便查询. 在nginx中事情就变成了这样:nginx只对 ...

  7. SpringBoot日志原理解析

    1.日志框架 小张:开发一个大型系统:1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件?2.框架来记录系统的一些运行时信息:日志框架 : ...

  8. Qt平台下使用QJson解析和构建JSON字符串

    前言 上一篇介绍了C语言写的JSON解析库cJSON的使用:使用cJSON库解析和构建JSON字符串 本篇文章介绍,Qt开发环境下QJson库的使用示例,JSON解析配合API接口,就可以实现一些有趣 ...

  9. Linux 解压xz格式文件及安装xz

    1.安装xz命令 # yum install epel-release -y # yum install xz -y 2.将xz文件解压为tar文件 # xz -d test.tar.xz 3.将ta ...

  10. python爬虫网页解析之lxml模块

    08.06自我总结 python爬虫网页解析之lxml模块 一.模块的安装 windows系统下的安装: 方法一:pip3 install lxml 方法二:下载对应系统版本的wheel文件:http ...