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 相关文章推荐
mac系统安装Python3初体验
Jan 02 Python
python中将zip压缩包转为gz.tar的方法
Oct 18 Python
PySide和PyQt加载ui文件的两种方法
Feb 27 Python
Ubuntu下Anaconda和Pycharm配置方法详解
Jun 14 Python
Python代理IP爬虫的新手使用教程
Sep 05 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 Python
Python箱型图处理离群点的例子
Dec 09 Python
Python中filter与lambda的结合使用详解
Dec 24 Python
解决pycharm中导入自己写的.py函数出错问题
Feb 12 Python
pytorch实现MNIST手写体识别
Feb 14 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
Nov 25 Python
python爬取招聘要求等信息实例
Nov 20 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
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
php xfocus防注入资料
2008/04/27 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
javascript读取xml
2006/11/04 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
vue2中引用及使用 better-scroll的方法详解
2018/11/15 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
2019/05/09 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
Python修改Excel数据的实例代码
2013/11/01 Python
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
浅谈MySQL中的触发器
2015/05/05 Python
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
详解Python传入参数的几种方法
2019/05/16 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
2019/07/11 Python
python打开使用的方法
2019/09/30 Python
python实现从wind导入数据
2019/12/03 Python
Python pandas如何向excel添加数据
2020/05/22 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
工程管理造价应届生求职信
2013/11/13 职场文书
学生喝酒检讨书
2014/02/06 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
纯CSS实现酷炫的霓虹灯效果
2021/04/13 HTML / CSS
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python
Java的Object类的九种方法
2022/04/13 Java/Android