Matplotlib animation模块实现动态图


Posted in Python onFebruary 25, 2021

matplotlib 画图功能非常强大,目前也只能根据官网 提供的例子简单地画几张图。最近学习了能画动态图的animation模块,作个简单地记录。

在matplotlib作图中,比较常用的是matplotlib.pyplot模块,这个模块有非常多的属性和方法,简要列举下这次用到的方法:
matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
返回fig和ax对象!

例子1. 动态画出sin函数曲线

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = ax.plot([], [], 'r-', animated=False)

def init():
  ax.set_xlim(0, 2*np.pi)
  ax.set_ylim(-1, 1)
  return ln,

def update(frame):
  xdata.append(frame)
  ydata.append(np.sin(frame))
  ln.set_data(xdata, ydata)
  return ln,

ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
          init_func=init, blit=True)
plt.show()

Matplotlib animation模块实现动态图

画这类图的关键是要给出不断更新的函数,这里就是update 函数了。注意, line, = ax.plot([], [], 'r-', animated=False) 中的, 表示创建tuple类型。迭代更新的数据frame 取值从frames 取得。

例子2. 动态显示一个动点,它的轨迹是sin函数。

import numpy as np 
import matplotlib.pyplot as plt
from matplotlib import animation

"""
animation example 2
author: Kiterun
"""

fig, ax = plt.subplots()
x = np.linspace(0, 2*np.pi, 200)
y = np.sin(x)
l = ax.plot(x, y)
dot, = ax.plot([], [], 'ro')

def init():
  ax.set_xlim(0, 2*np.pi)
  ax.set_ylim(-1, 1)
  return l

def gen_dot():
  for i in np.linspace(0, 2*np.pi, 200):
    newdot = [i, np.sin(i)]
    yield newdot

def update_dot(newd):
  dot.set_data(newd[0], newd[1])
  return dot,

ani = animation.FuncAnimation(fig, update_dot, frames = gen_dot, interval = 100, init_func=init)
ani.save('sin_dot.gif', writer='imagemagick', fps=30)

plt.show()

这里我们把生成的动态图保存为gif图片,前提要预先安装imagemagic。

Matplotlib animation模块实现动态图

例子3. 单摆(没阻尼&有阻尼)

无阻尼的单摆力学公式:

Matplotlib animation模块实现动态图

附加阻尼项:

Matplotlib animation模块实现动态图

这里需要用到scipy.integrate的odeint模块,具体用法找时间再专门写一篇blog吧,动态图代码如下:

# -*- coding: utf-8 -*-

from math import sin, cos
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
import matplotlib.animation as animation

g = 9.8
leng = 1.0
b_const = 0.2

# no decay case:
def pendulum_equations1(w, t, l):
  th, v = w
  dth = v
  dv = - g/l * sin(th)
  return dth, dv

# the decay exist case:
def pendulum_equations2(w, t, l, b):
  th, v = w
  dth = v
  dv = -b/l * v - g/l * sin(th)
  return dth, dv

t = np.arange(0, 20, 0.1)
track = odeint(pendulum_equations1, (1.0, 0), t, args=(leng,))
#track = odeint(pendulum_equations2, (1.0, 0), t, args=(leng, b_const))
xdata = [leng*sin(track[i, 0]) for i in range(len(track))]
ydata = [-leng*cos(track[i, 0]) for i in range(len(track))]

fig, ax = plt.subplots()
ax.grid()
line, = ax.plot([], [], 'o-', lw=2)
time_template = 'time = %.1fs'
time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes)

def init():
  ax.set_xlim(-2, 2)
  ax.set_ylim(-2, 2)
  time_text.set_text('')
  return line, time_text

def update(i):
  newx = [0, xdata[i]]
  newy = [0, ydata[i]]
  line.set_data(newx, newy)
  time_text.set_text(time_template %(0.1*i))
  return line, time_text

ani = animation.FuncAnimation(fig, update, range(1, len(xdata)), init_func=init, interval=50)
#ani.save('single_pendulum_decay.gif', writer='imagemagick', fps=100)
ani.save('single_pendulum_nodecay.gif', writer='imagemagick', fps=100)
plt.show()

Matplotlib animation模块实现动态图 

Matplotlib animation模块实现动态图

例子4. 滚动的球

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation

fig = plt.figure(figsize=(6, 6))
ax = plt.gca()
ax.grid()
ln1, = ax.plot([], [], '-', lw=2)
ln2, = ax.plot([], [], '-', color='r', lw=2)
theta = np.linspace(0, 2*np.pi, 100)
r_out = 1
r_in = 0.5

def init():
  ax.set_xlim(-2, 2)
  ax.set_ylim(-2, 2)
  x_out = [r_out*np.cos(theta[i]) for i in range(len(theta))]
  y_out = [r_out*np.sin(theta[i]) for i in range(len(theta))]
  ln1.set_data(x_out, y_out)
  return ln1,

def update(i):
  x_in = [(r_out-r_in)*np.cos(theta[i])+r_in*np.cos(theta[j]) for j in range(len(theta))]
  y_in = [(r_out-r_in)*np.sin(theta[i])+r_in*np.sin(theta[j]) for j in range(len(theta))]
  ln2.set_data(x_in, y_in)
  return ln2,

ani = animation.FuncAnimation(fig, update, range(len(theta)), init_func=init, interval=30)
ani.save('roll.gif', writer='imagemagick', fps=100)

plt.show()

Matplotlib animation模块实现动态图

到此这篇关于Matplotlib animation模块实现动态图 的文章就介绍到这了,更多相关Matplotlib 动态图 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python解析发往本机的数据包示例 (解析数据包)
Jan 16 Python
详解Python的Django框架中的通用视图
May 04 Python
python自动zip压缩目录的方法
Jun 28 Python
利用python实现简单的循环购物车功能示例代码
Jul 05 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
Python中生成器和迭代器的区别详解
Feb 10 Python
使用python list 查找所有匹配元素的位置实例
Jun 11 Python
python之拟合的实现
Jul 19 Python
python中调试或排错的五种方法示例
Sep 12 Python
python 插入日期数据到Oracle实例
Mar 02 Python
python 制作简单的音乐播放器
Nov 25 Python
Python爬取酷狗MP3音频的步骤
Feb 26 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
Feb 24 #Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 #Python
用pip给python安装matplotlib库的详细教程
Feb 24 #Python
matplotlib 范围选区(SpanSelector)的使用
Feb 24 #Python
matplotlib之多边形选区(PolygonSelector)的使用
Feb 24 #Python
matplotlib部件之套索Lasso的使用
Feb 24 #Python
matplotlib之属性组合包(cycler)的使用
Feb 24 #Python
You might like
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
php正则修正符用法实例详解
2016/12/29 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
从JavaScript的函数重名看其初始化方式
2007/03/08 Javascript
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
JavaScript中的typeof操作符用法实例
2014/04/05 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
vue2.0中goods选购栏滚动算法的实现代码
2017/05/17 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
2019/04/30 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
js实现左右轮播图
2020/01/09 Javascript
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
2020/02/01 jQuery
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
关于赌博的检讨书
2014/01/08 职场文书
大学毕业自我评价
2014/02/02 职场文书
酒店管理求职信范文
2014/04/06 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
阿里云k8s服务升级时502错误 springboot项目应用
2022/04/09 Servers