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开发之tkinter实现图形随鼠标移动的方法
Nov 11 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 Python
python计算auc指标实例
Jul 13 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
Feb 07 Python
Python实现判断一行代码是否为注释的方法
May 23 Python
关于python写入文件自动换行的问题
Jun 23 Python
在Pandas中处理NaN值的方法
Jun 25 Python
Python Tkinter模块 GUI 可视化实例
Nov 20 Python
django使用JWT保存用户登录信息
Apr 22 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
Python pandas之求和运算和非空值个数统计
Aug 07 Python
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Oct 16 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
解析thinkphp基本配置 convention.php
2013/06/18 PHP
php实现下载限制速度示例分享
2014/02/13 PHP
PHP版微信公众平台红包API
2015/04/02 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
PHP之多条件混合筛选功能的实现方法
2019/10/09 PHP
jQuery入门知识简介
2010/03/04 Javascript
javascript中强制执行toString()具体实现
2013/04/27 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
js动态生成Html元素实现Post操作(createElement)
2015/09/14 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
小程序如何定位所在城市及发起周边搜索
2020/02/11 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
JS实现可以用键盘方向键控制的动画
2020/12/11 Javascript
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
对python程序内存泄漏调试的记录
2018/06/11 Python
Python爬虫之pandas基本安装与使用方法示例
2018/08/08 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
Python3多目标赋值及共享引用注意事项
2019/05/27 Python
python如何实现复制目录到指定目录
2020/02/13 Python
Python使用socketServer包搭建简易服务器过程详解
2020/06/12 Python
python中有帮助函数吗
2020/06/19 Python
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
工作自我评价怎么写
2014/01/29 职场文书
学校志愿者活动总结
2014/06/27 职场文书
党员带头倡议书
2015/04/29 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
前端JavaScript大管家 package.json
2021/11/02 Javascript