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读写ini文件示例(python读写文件)
Mar 25 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 Python
详解python的数字类型变量与其方法
Nov 20 Python
python并发编程之线程实例解析
Dec 27 Python
Python实现的多叉树寻找最短路径算法示例
Jul 30 Python
python贪吃蛇游戏代码
Apr 18 Python
python 实现提取某个索引中某个时间段的数据方法
Feb 01 Python
深入理解Django-Signals信号量
Feb 19 Python
python 实现兔子生兔子示例
Nov 21 Python
python自动点赞功能的实现思路
Feb 26 Python
解决Jupyter因卸载重装导致的问题修复
Apr 10 Python
浅谈keras2 predict和fit_generator的坑
Jun 17 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
php,不用COM,生成excel文件
2006/10/09 PHP
ThinkPHP的Widget扩展实例
2014/06/19 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
laravel 修改记住我功能的cookie保存时间的方法
2019/10/14 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
20条学习javascript的编程规范的建议
2014/11/28 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
浅谈JS封闭函数、闭包、内置对象
2017/07/18 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
2020/04/28 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
js实现扫雷源代码
2020/11/27 Javascript
JS实现简易日历效果
2021/01/25 Javascript
python 正则式使用心得
2009/05/07 Python
Python守护进程和脚本单例运行详解
2017/01/06 Python
python记录程序运行时间的三种方法
2017/07/14 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
python如何爬取动态网站
2020/09/09 Python
Python+OpenCV检测灯光亮点的实现方法
2020/11/02 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
AJAX的优缺点都有什么
2015/08/18 面试题
大学生支教感言
2015/08/01 职场文书
解析Redis Cluster原理
2021/06/21 Redis
python模板入门教程之flask Jinja
2022/04/11 Python