Matplotlib绘图及动画总结
Matplotlib绘图总结
绘图原理
block模式(python默认)
plt.polt()
等绘图函数不会直接在窗口中绘图,只有调用plt.show()
(默认block=True
)或plt.pause()
(窗口自动关闭)时才将内存中的图绘制到窗口。程序碰到第一个
plt.show()
时,绘图后会暂停执行,直到手动关闭当前窗口才继续执行后面的代码,这就是“阻塞”的含义。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模式默认)
开启interactive模式,用
plt.ion()
,放在绘图之前,关闭该模式用plt.ioff()
不用
plt.show()
或plt.pause()
,只要plt.plot()
等语句就能在窗口中绘图,但是,绘图后窗口立马自动关闭,你压根都没法看清楚;可以用plt.pause(time)
进行延迟自动关闭时间,需要注意的是如果有多个plt.pause()
穿插在不同绘图函数下,那么前面的窗口不会先关闭,会等到最后一个plt.pause()
结束后再一起关闭。该模式下要实现同时绘图,且保持,可用plt.pause(0)
,但程序会结束在该位置,手动关闭窗口也不会继续执行了,因此plt.pause(0)
应放在程序最后。该模式下,即使用了
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://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绘图及动画总结的更多相关文章
- matplotlib 绘图
http://blog.csdn.net/jkhere/article/details/9324823 都打一遍 5 matplotlib-绘制精美的图表 matplotlib 是python最著名的 ...
- >炫酷的计时器效果Canvas绘图与动画<
>炫丽的计时器效果Canvas绘图与动画< 虽然我是学习java的,但是因为最近使用html5的关系,多学习了一下前端知识. 现在,我要介绍的计时器是十分炫酷的,使用画布完成. 喜欢htm ...
- 用C#绘图实现动画出现卡屏(运行慢)问题的解决办法
原文:用C#绘图实现动画出现卡屏(运行慢)问题的解决办法 正在用C#做一个小游戏,需要用到动画,上次解决的问题是闪烁问题,用双缓冲技术.以为不会有什么问题了.后来当把图片全部绘制上去的时候依然出现了卡 ...
- python实战学习之matplotlib绘图续
学习完matplotlib绘图可以设置的属性,还需要学习一下除了折线图以外其他类型的图如直方图,条形图,散点图等,matplotlib还支持更多的图,具体细节可以参考官方文档:https://matp ...
- matplotlib绘图的基本操作
转自:Laumians博客园 更简明易懂看Matplotlib Python 画图教程 (莫烦Python)_演讲•公开课_科技_bilibili_哔哩哔哩 https://www.bilibili. ...
- python中利用matplotlib绘图可视化知识归纳
python中利用matplotlib绘图可视化知识归纳: (1)matplotlib图标正常显示中文 import matplotlib.pyplot as plt plt.rcParams['fo ...
- matplotlib绘图基本用法-转自(http://blog.csdn.net/mao19931004/article/details/51915016)
本文转载自http://blog.csdn.net/mao19931004/article/details/51915016 <!DOCTYPE html PUBLIC "-//W3C ...
- python实战学习之matplotlib绘图
matplotlib 是最流行的Python底层绘图库,主要做数据可视化图表 可以将数据可视化,能够更直观的呈现数据 matplotlib绘图基本要点 首先实现一个简单的绘图 # 导入pyplot f ...
- 【原】在Matplotlib绘图中添加Latex风格公式
Matplotlib绘图的过程中,可以为各个轴的Label,图像的Title.Legend等元素添加Latex风格的公式. 只需要在Latex公式的文本前后各增加一个$符号,Matplotlib就可以 ...
随机推荐
- python将字符串插入表中避免单双引号问题
调用pymysql.escape_string('向数据库插入的数据') 例如: import pymysql str = 'as"sdf' print(pymysql.escape_str ...
- 编辑器之神vim的一些常用快捷键整理
yy:复制 光标所在的这一行 4yy:复制 光标所在行开始向下的4行 p:粘贴 dd:剪切(删除) 光标所在的这一行 4dd:剪切(删除) 光标所在行向下的4行 D:从当前的光标开始向后剪切,一直到行 ...
- 《Web Development with Go》Middleware之使用codegangsta.negroni
这个第三方库,使用自定义中间件时, 语法就感觉流畅很多. package main import ( "fmt" "log" "net/http&qu ...
- 数组类的创建——DynamicArray.h
完成DynamicArray类的具体实现 DynamicArray设计要点——类模板 动态确定内部数组空间的大小 实现函数返回数组长度 拷贝构造和赋值操作 DynamicArray类的声明 templ ...
- RTP Payload Format for VP8 Video
整体结构 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+ ...
- 《推送开发全面盘点当前Android后台保活方案的真实运行效果》
登录 立即注册 TCP/IP详解 资讯 动态 社区 技术精选 首页 即时通讯网›专项技术区›推送开发全面盘点当前Android后台保活方案的真实运行效果(截止2 ... 帖子 打赏 分 ...
- CountDownLatch原理分析
CountDownLatch原理分析 CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行.例如,应用程序的主线程希望在负责启动框架服务的线程已经启动 ...
- SpringBoot整合MyBatis-Plus3.1详细教程
作者:Sans_ juejin.im/post/5cfa6e465188254ee433bc69 一.说明 Mybatis-Plus是一个Mybatis框架的增强插件,根据官方描述,MP只做增强不做改 ...
- (五十六)c#Winform自定义控件-瓶子(工业)-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...
- C# show Environment property info name and value retrieve, Maximize the Console Window based on window resolution
using System.Reflection; static void ShowEnvironmentInfoDemo() { Type type = typeof(Environment); Pr ...