纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

Matplotlib库绘制动画 怎样利用Matplotlib库绘制动画及保存GIF图片

frank909   2021-06-07 我要评论
想了解怎样利用Matplotlib库绘制动画及保存GIF图片的相关内容吗frank909在本文为您仔细讲解Matplotlib库绘制动画的相关知识和一些Code实例欢迎阅读和指正我们先划重点:matplotlib,绘制动画,matplotlib库,matplotlib动画下面大家一起来学习吧

前言

在自学机器学习或者是深度学习的过程中有的时候总想把执行过程或者执行结果显示出来所以就想到了动画好在用 Python 实现动画有许多中方式而大家熟知的 Matplotlib 库就可以实现

本文的目的是对 Matplotlib 的动画实现手段做一个简单的说明

绘制动画

import matplotlib.pyplot as plt
import matplotlib.animation as animation

如果要让 matplotlib 实现动画功能的话那么就要引入 animation 模块

然后再创建 animation 的对象

anim = animation.FuncAnimation(fig, run, data_gen, blit=False, interval=10,
                              repeat=False, init_func=init)

animation 的实现类是 FuncAnimation它有一个构造方法下面先通过一个示例讲解 animation 的基本用法然后再来细致分析 FuncAnimation 构造方法中各项参数的意义

我们的目标是做一个 Sin 函数的动画示例

代码很简单

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

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'ro',animated=True)

def init():
    ax.set_xlim(-np.pi,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,

anim = animation.FuncAnimation(fig, update, frames=np.linspace(-np.pi,np.pi, 90),interval=10,
                    init_func=init,blit=True)
plt.show()

核心代码是这一行

anim = animation.FuncAnimation(fig, update, frames=np.linspace(-np.pi,np.pi, 90),interval=10,
                    init_func=init,blit=True)

按照上面的示例代码我们可以依葫芦画瓢编写动画代码了

但如果我们需要达到灵活运用的话就需要花点心思了解它们的机制

我们先来看看 FuncAnimation 的构造方法

def __init__(self, fig, func, frames=None, init_func=None, fargs=None,
                 save_count=None, **kwargs):

fig 自然是 matplotlib 中的 figure 对象

func 是每一次更新时所调用的方法,它是回调函数因此我们可以在这个方法中更新 figure 当中的 axes 中的 line2d 对象它是动态更新 figure 的根本

frames 代表了整个动画过程中帧的取值范围而本质上是一个数据发生器我将在后面重点讲解它

init_func 是初始函数用来初始 figure 的画面

fargs 是每次附加给 func 回调函数的参数可以为 None

save_count 是缓存的数量

除此之外还有一些可选的参数它们分别是

interval 是每 2 个 frame 发生的时间间隔,单位是 ms默认值是 200.

repeat_delay 取值是数值如果 animation 是重复播放的话这个值就是每次播放之间的延迟时间单位是 ms

repeat bool 型可选参数默认为 True代表动画是否会重复执行

blit bool 型可选参数控制绘制的优化默认是 False

如何理解 animation 呢?

我认为animation 的核心是 frames 和 func

frames 可以取值:iterableint,generator 生成器函数 或者是 None

在上面的代码中我们给 frames 的取值是这样的

frames=np.linspace(-np.pi,np.pi, 90)

其实就是一个 list它的值范围为 -pi 到 piframes 总共有 90 帧而 list 是一个 iterable 类型所以它可以不停的迭代

frames 也可以取值为整数相当于给参数赋值 range(frames)

frames 也可以取值为 None,那么它的结果相当于传递 itertools.count,结构就是从 0 开始每次步进 1无限的执行下去

frames 还接受 generator 函数也就是生成器但有个前提是生成器要符合下面的签名格式

def gen_function() -> obj

参数列表为空但需要返回一个值这个值就会传入到 func 回调函数当中

func 是回调函数它会在每次更新的时候被调用所以我们只需要在这个函数中更新 figure 中的数值就可以了就像下面代码

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

frames 和 func 的关系是什么?

实际上frames 决定了整个动画 frame 的取值范围它会在 interval 时间内迭代一次然后将值传递给 func直到整个 frames 迭代完毕

我本人而言也更倾向于用 generator 函数去定义 frames 而不是直接分配一个列表所以我可以将之前的代码改写如下

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

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'ro',animated=True)

def init():
    ax.set_xlim(-np.pi,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,

def data_gen():

    frame = -np.pi

    step = 2 * np.pi / 90

    while frame < np.pi:
        frame += step
        yield frame

# anim = animation.FuncAnimation(fig, update, frames=np.linspace(-np.pi,np.pi, 360),interval=10,
#                     init_func=init,blit=True)
anim = animation.FuncAnimation(fig, update, frames=data_gen,interval=10,
                    init_func=init,blit=True)

plt.show()

data_gen 就是一个生成器函数它会每隔 10ms 运行一次然后将结果传递给 update 函数

data_gen 里面运用到了 yield 关键字这是的我们可以在每次迭代时才返回相应的结构而不要在一开始就分配如果不熟悉这方面知识点的同学可以自行搜索相应的知识

保存动画

因为经常写博客所以也经常需要将结果保存下来一般我会保存为 .gif 格式图片本篇博文的 gif 图像就是通过 matplotlib 保存的

好在用 matplotlib 实现它也并不难

anim.save('test_animation.gif',writer='imagemagick')

一句代码就搞定了运行成功后会在当前目录下生成 test_animation.gif 图像

需要注意到的是如果要保存 gif 图像这要求开发者电脑已经安装了 ImageMagicK

ubuntu 用户可以通过如下命令安装

sudo apt-get install imagemagick

并且动画保存的时候要指定 writer 为 imagemagick.

动画可以保存为 gif 图像自然也能保存为 mp4 视频格式

但这要求开发者计算机已经安装好 ffmpeg 库并且 save 方法中指定 writer 为 ffmpeg,具体细节请读者自行扩展阅读

总结


相关文章

猜您喜欢

  • Spring Mvc Long类型 解析Spring Mvc Long类型精度丢失问题

    想了解解析Spring Mvc Long类型精度丢失问题的相关内容吗诸葛小亮在本文为您仔细讲解Spring Mvc Long类型的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Spring,Mvc,Long类型,Spring,Mvc,Long,精度丢失下面大家一起来学习吧..
  • Pytorch Softmax的dim参数使用 Pytorch中torch.nn.Softmax的dim参数用法说明

    想了解Pytorch中torch.nn.Softmax的dim参数用法说明的相关内容吗乐清sss在本文为您仔细讲解Pytorch Softmax的dim参数使用的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Pytorch,torch.nn.Softmax,dim参数下面大家一起来学习吧..

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式