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的装饰器的运用
May 05 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
Jan 10 Python
python分批定量读取文件内容,输出到不同文件中的方法
Dec 08 Python
简单了解Python matplotlib线的属性
Jun 29 Python
如何安装并使用conda指令管理python环境
Jul 10 Python
基于python操作ES实例详解
Nov 16 Python
基于Pyinstaller打包Python程序并压缩文件大小
May 28 Python
python IP地址转整数
Nov 20 Python
全网最全python库selenium自动化使用详细教程
Jan 12 Python
python实现简单聊天功能
Jul 07 Python
python中Pyqt5使用Qlabel标签播放视频
Apr 22 Python
彻底弄懂Python中的回调函数(callback)
Jun 25 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
DC动画电影《黑暗正义联盟》曝预告 5月5日上线数字平台
2020/04/09 欧美动漫
syphon 虹吸式咖啡冲泡冲煮倒水的得与失
2021/03/03 冲泡冲煮
BBS(php &amp; mysql)完整版(六)
2006/10/09 PHP
php框架Phpbean说明
2008/01/10 PHP
php短域名转换为实际域名函数
2011/01/17 PHP
PHP删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
微信公众平台天气预报功能开发
2014/07/06 PHP
PHP实现导出带样式的Excel
2016/08/28 PHP
ajaxControlToolkit AutoCompleteExtender的用法
2008/10/30 Javascript
JavaScript中的闭包原理分析
2010/03/08 Javascript
模拟select的代码
2011/10/19 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
2014/05/26 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
jQuery unbind 删除绑定事件详解
2016/05/24 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
jQuery与vue实现拖动验证码功能
2018/01/30 jQuery
vue中轮训器的使用
2019/01/27 Javascript
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
Python打包可执行文件的方法详解
2016/09/19 Python
浅谈django中的认证与登录
2016/10/31 Python
Python实现将json文件中向量写入Excel的方法
2018/03/26 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
10个python爬虫入门实例(小结)
2020/11/01 Python
HTML5页面无缝闪开的问题及解决方案
2020/06/11 HTML / CSS
Tiqets荷兰:出售欧洲最美丽的景点和博物馆门票
2018/01/09 全球购物
酒店执行总经理岗位职责
2013/12/15 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
2015年物流客服工作总结
2015/07/27 职场文书
SQL Server数据库基本概念、组成、常用对象与约束
2022/03/20 SQL Server
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL