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中设置变量作为默认值时容易遇到的错误
Apr 03 Python
详解Django框架中用context来解析模板的方法
Jul 20 Python
Python算术运算符实例详解
May 31 Python
Python中pygal绘制雷达图代码分享
Dec 07 Python
使用python实现BLAST
Feb 12 Python
python合并同类型excel表格的方法
Apr 01 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
Oct 15 Python
python3对拉勾数据进行可视化分析的方法详解
Apr 03 Python
python接口自动化(十六)--参数关联接口后传(详解)
Apr 16 Python
如何在Django配置文件里配置session链接
Aug 06 Python
python读取xml文件方法解析
Aug 04 Python
pycharm 2020 1.1的安装流程
Sep 29 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
ftp类(myftp.php)
2006/10/09 PHP
实现php加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
JS打印gridview实现原理及代码
2013/02/05 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
详解Angular CLI + Electron 开发环境搭建
2017/07/20 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
Vue入门之animate过渡动画效果
2018/04/08 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
微信小程序图片右边加两行文字的代码
2020/04/23 Javascript
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
2020/07/27 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
Python enumerate遍历数组示例应用
2008/09/06 Python
python之wxPython应用实例
2014/09/28 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
Python数据抓取爬虫代理防封IP方法
2018/12/23 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
python实现邮件自动发送
2019/08/10 Python
python实现126邮箱发送邮件
2020/05/20 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
厨房管理计划书
2014/04/27 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
2014年导购员工作总结
2014/11/18 职场文书
python之np.argmax()及对axis=0或者1的理解
2021/06/02 Python