Python使用matplotlib绘制动画的方法


Posted in Python onMay 20, 2015

本文实例讲述了Python使用matplotlib绘制动画的方法。分享给大家供大家参考。具体分析如下:

matplotlib从1.1.0版本以后就开始支持绘制动画

下面是几个的示例:

第一个例子使用generator,每隔两秒,就运行函数data_gen:

# -*- coding: utf-8 -*-  
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
fig = plt.figure() 
axes1 = fig.add_subplot(111) 
line, = axes1.plot(np.random.rand(10)) 
#因为update的参数是调用函数data_gen,
#所以第一个默认参数不能是framenum 
def update(data): 
  line.set_ydata(data) 
  return line, 
# 每次生成10个随机数据 
def data_gen(): 
  while True: 
    yield np.random.rand(10) 
ani = animation.FuncAnimation(fig, update, data_gen, interval=2*1000)
plt.show()

第二个例子使用list(metric),每次从metric中取一行数据作为参数送入update中:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
start = [1, 0.18, 0.63, 0.29, 0.03, 0.24, 0.86, 0.07, 0.58, 0] 
metric =[[0.03, 0.86, 0.65, 0.34, 0.34, 0.02, 0.22, 0.74, 0.66, 0.65], 
     [0.43, 0.18, 0.63, 0.29, 0.03, 0.24, 0.86, 0.07, 0.58, 0.55], 
     [0.66, 0.75, 0.01, 0.94, 0.72, 0.77, 0.20, 0.66, 0.81, 0.52] 
    ] 
fig = plt.figure() 
window = fig.add_subplot(111) 
line, = window.plot(start) 
#如果是参数是list,则默认每次取list中的一个元素,
#即metric[0],metric[1],...
def update(data): 
  line.set_ydata(data) 
  return line, 
ani = animation.FuncAnimation(fig, update, metric, interval=2*1000) 
plt.show()

第三个例子:

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib import animation 
# First set up the figure, the axis, and the plot element we want to animate 
fig = plt.figure() 
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2)) 
line, = ax.plot([], [], lw=2) 
# initialization function: plot the background of each frame 
def init(): 
  line.set_data([], []) 
  return line, 
# animation function. This is called sequentially 
# note: i is framenumber 
def animate(i): 
  x = np.linspace(0, 2, 1000) 
  y = np.sin(2 * np.pi * (x - 0.01 * i)) 
  line.set_data(x, y) 
  return line, 
# call the animator. blit=True means only re-draw the parts that have changed. 
anim = animation.FuncAnimation(fig, animate, init_func=init, 
                frames=200, interval=20, blit=True) 
#anim.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264']) 
plt.show()

第四个例子:

# -*- coding: utf-8 -*- 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
# 每次产生一个新的坐标点 
def data_gen(): 
  t = data_gen.t 
  cnt = 0 
  while cnt < 1000: 
    cnt+=1 
    t += 0.05 
    yield t, np.sin(2*np.pi*t) * np.exp(-t/10.) 
data_gen.t = 0 
# 绘图 
fig, ax = plt.subplots() 
line, = ax.plot([], [], lw=2) 
ax.set_ylim(-1.1, 1.1) 
ax.set_xlim(0, 5) 
ax.grid() 
xdata, ydata = [], [] 
# 因为run的参数是调用函数data_gen,
# 所以第一个参数可以不是framenum:设置line的数据,返回line 
def run(data): 
  # update the data 
  t,y = data 
  xdata.append(t) 
  ydata.append(y) 
  xmin, xmax = ax.get_xlim() 
  if t >= xmax: 
    ax.set_xlim(xmin, 2*xmax) 
    ax.figure.canvas.draw() 
  line.set_data(xdata, ydata) 
  return line, 
# 每隔10秒调用函数run,run的参数为函数data_gen, 
# 表示图形只更新需要绘制的元素 
ani = animation.FuncAnimation(fig, run, data_gen, blit=True, interval=10, 
  repeat=False) 
plt.show()

再看下面的例子:

# -*- coding: utf-8 -*- 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
#第一个参数必须为framenum 
def update_line(num, data, line): 
  line.set_data(data[...,:num]) 
  return line, 
fig1 = plt.figure() 
data = np.random.rand(2, 15) 
l, = plt.plot([], [], 'r-') 
plt.xlim(0, 1) 
plt.ylim(0, 1) 
plt.xlabel('x') 
plt.title('test') 
#framenum从1增加大25后,返回再次从1增加到25,再返回... 
line_ani = animation.FuncAnimation(fig1, update_line, 25,fargs=(data, l),interval=50, blit=True) 
#等同于 
#line_ani = animation.FuncAnimation(fig1, update_line, frames=25,fargs=(data, l), 
#  interval=50, blit=True) 
#忽略frames参数,framenum会从1一直增加下去知道无穷 
#由于frame达到25以后,数据不再改变,所以你会发现到达25以后图形不再变化了 
#line_ani = animation.FuncAnimation(fig1, update_line, fargs=(data, l),
#  interval=50, blit=True) 
plt.show()

希望本文所述对大家的python程序设计有所帮助。

Python 相关文章推荐
Python遍历文件夹和读写文件的实现代码
Aug 28 Python
使用tensorflow实现线性回归
Sep 08 Python
python实现简单的单变量线性回归方法
Nov 08 Python
Python获取网段内ping通IP的方法
Jan 31 Python
Python3实现定时任务的四种方式
Jun 03 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
Jun 19 Python
django 多对多表的创建和插入代码实现
Sep 09 Python
基于pytorch的lstm参数使用详解
Jan 14 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
Django ORM实现按天获取数据去重求和例子
May 18 Python
python中scrapy处理项目数据的实例分析
Nov 22 Python
Python爬虫基础讲解之请求
May 13 Python
Python中subprocess模块用法实例详解
May 20 #Python
python检测某个变量是否有定义的方法
May 20 #Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 #Python
python使用PyGame模块播放声音的方法
May 20 #Python
python实现带声音的摩斯码翻译实现方法
May 20 #Python
python定时检查某个进程是否已经关闭的方法
May 20 #Python
Python操作列表之List.insert()方法的使用
May 20 #Python
You might like
一个很不错的PHP翻页类
2009/06/01 PHP
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
jquery 锁定弹出层实现代码
2010/02/23 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
js控制table合并具体实现
2014/02/20 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
javascript实现下雪效果【实例代码】
2016/05/03 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
面包屑导航详解
2017/12/07 Javascript
vue1.0和vue2.0的watch监听事件写法详解
2018/09/11 Javascript
JS实现简单打字测试
2020/06/24 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
python使用PyQt5的简单方法
2019/02/27 Python
详解Python locals()的陷阱
2019/03/26 Python
Python3 批量扫描端口的例子
2019/07/25 Python
Django对models里的objects的使用详解
2019/08/17 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
Python输出指定字符串的方法
2020/02/06 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
毕业自我鉴定范文
2013/11/06 职场文书
骨干教师培训制度
2014/01/13 职场文书
企业军训感言
2014/02/08 职场文书
《秋游》教学反思
2014/04/24 职场文书
二审代理词范文
2015/05/25 职场文书
在职证明书模板
2015/06/15 职场文书
医院感染管理制度
2015/08/05 职场文书
八年级作文之我的母亲
2019/12/10 职场文书