Matplotlib绘图基础之动画绘制详解

 更新时间:2023年08月09日 09:46:27   作者:databook  
matplotlib的动画一直是一个强大但使用频率不高的功能,通过动画来展示数据和模型的变化过程,可使数据的可视化更加生动形象,下面就跟随小编一起学习一下Matplotlib是如何绘制动画的吧

matplotlib动画一直是一个强大但使用频率不高的功能,究其原因,一方面展示动画需要一定的媒介,没有图形和文字展示方便;二来大家更关心的是分析结果的最终图表,图表的动态展示则没有那么重要。

不过,随着短视频的兴起,在短视频平台上展示动画变得非常容易,所以,我们发现有越来越多的数据分析动画(比如各种横向条形图的排名等等)出现在了短视频平台上。

通过动画来展示数据和模型的变化过程,可使数据的可视化更加生动形象,随着各种平台的兴起,matplotlib的动画功能也因此有了更多的用武之地。

1. 动画示例

介绍matplotlib的动画功能之前,先看用matplotlib制作的两个简单的的动画示例。

1.1. 单个动画

首先是单个动画,绘制一个正弦曲线。

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animation
x = np.linspace(-8, 8, 100)
y = np.sin(x)
fig, ax = plt.subplots()
(g,) = ax.plot(x, y)
def update(frame):
    y = np.sin(x[:frame])
    g.set_data(x[:frame], y)
animation.FuncAnimation(fig, update, interval=50, frames=len(x))

1.2. 组合动画

除了单个动画之外,组合动画也简单,下面的示例中,先绘制一个正弦曲线,然后一个点沿着曲线运动,随着这个点,绘制正弦曲线的切线。

x = np.linspace(-8, 8, 100)
f = lambda x: np.sin(x / 2)
fig, ax = plt.subplots()
fig.set_size_inches(8, 4)
ax.plot(x, f(x), 'lightblue')
(point,) = ax.plot(x[0], f(x[0]), "r", alpha=0.4, marker="o")
(line,) = ax.plot([0], [0], "g", linewidth=3)
#绘制切线
def tangent_line(x0, y0):
    h = 1e-4
    num_min = f(x0 - h)
    num_max = f(x0 + h)
    k = (num_max - num_min) / (2 * h)
    xs = np.linspace(x0 - 0.5, x0 + 0.5, 100)
    ys = y0 + k * (xs - x0)
    return xs, ys
#移动切点
def move_point(frame):
    point.set_data([x[frame]], [f(x[frame])])
    xs, ys = tangent_line(x[frame], f(x[frame]))
    line.set_data(xs, ys)
animation.FuncAnimation(fig, move_point, interval=50, frames=len(x))

2. 动画函数

matplotlib的动画函数主要有两种,它们的动画原理差别很大,了解它们之间的区别,才能根据自己的场景选择合适的动画函数。

2.1. FuncAnimation

上一节的示例中使用的就是FuncAnimation,它的动画原理是通过回调函数,不断重绘图形,已达到动画的效果。
主要的参数有:

  • 画布:比如上面第一个示例中的 fig
  • 回调函数:比如上面第一个示例中的 update
  • 调用回调函数的间隔:比如上面第一个示例中的 interval=50,单位是毫秒
  • 调用回调函数的次数:比如上面第一个示例中的 frames=len(x)

简单来说,也就是FuncAnimation函数每隔interval毫秒,调用一次update,一共调用frames次。

2.2. ArtistAnimation

ArtistAnimation函数的原理则是先准备好每一帧的数据,然后绘制按照一定的时间间隔,绘制每一帧数据对应的图像。

比如上面的示例一样的正弦曲线,用ArtistAnimation函数绘制的话:

points = np.linspace(-8, 8, 100)
fig, ax = plt.subplots()
frames = []
for i in range(50):
    x = points[:i]
    y = np.sin(x)
    g = ax.plot(x, y)
    frames.append(g)
animation.ArtistAnimation(fig, frames, interval=50)

ArtistAnimation的主要参数:

  • 画布:比如上面示例中的 fig
  • 每一帧的数据:比如上面示例中的 frames
  • 每一帧的间隔:比如上面示例中的 interval=50,单位是毫秒

ArtistAnimation没有回调函数,只要准备好每一帧的数据,它会按照时间间隔绘制每一帧的数据。

3. 动画导出

最后,是动画的导出,常用的两种格式是MP4GIF
如果安装了 ffmpeg,那么导出这两种格式就很简单了。

3.1. 导出mp4

#前面部分省略。。。
anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x))
anim.save("./output.mp4", writer='ffmpeg')

导出的文件名后缀 mp4,则可以导出视频。

这里的writer参数用ffmpeg

3.2. 导出GIF

同样,导出gif也一样,文件名的后缀 gif即可。

#前面部分省略。。。
anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x))
anim.save("./output.gif", writer='ffmpeg')

当然,也可以不用ffmpeg,比如,如果安装了imagemagick,这里的writer也可以用imagemagick

#前面部分省略。。。
anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x))
anim.save("./output.gif", writer='imagemagick')

以上就是Matplotlib绘图基础之动画绘制详解的详细内容,更多关于Matplotlib动画的资料请关注脚本之家其它相关文章!

相关文章

  • python爬虫http代理使用方法

    python爬虫http代理使用方法

    在本篇文章里小编给大家整理的是一篇关于python爬虫http代理使用方法相关内容,有需要的朋友们可以跟着学习参考下。
    2021-09-09
  • python根据json数据画疫情分布地图的详细代码

    python根据json数据画疫情分布地图的详细代码

    这篇文章主要介绍了python根据json数据画疫情分布地图的详细代码,掌握使用pyecharts构建基础的全国地图可视化图表,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • python实现电子书翻页小程序

    python实现电子书翻页小程序

    这篇文章主要为大家详细介绍了python实现电子书翻页小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Python 虚拟环境迁移到其他电脑的实现

    Python 虚拟环境迁移到其他电脑的实现

    本文主要介绍了Python 虚拟环境迁移到其他电脑的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Python 多线程实例详解

    Python 多线程实例详解

    这篇文章主要介绍了Python 多线程实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • python求平均值多种方法代码示例

    python求平均值多种方法代码示例

    要求一个列表中的数的平均值,我们可以使用Python来实现,这篇文章主要给大家介绍了关于python求平均值多种方法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • python的paramiko模块基本用法详解

    python的paramiko模块基本用法详解

    paramiko 是一个用于在Python中执行远程操作的模块,支持SSH协议,它可以用于连接到远程服务器,执行命令、上传和下载文件,以及在远程服务器上执行各种操作,这篇文章主要介绍了python的paramiko模块基本用法,需要的朋友可以参考下
    2023-08-08
  • 在Python3中使用asyncio库进行快速数据抓取的教程

    在Python3中使用asyncio库进行快速数据抓取的教程

    这篇文章主要介绍了在Python3中使用asyncio进行快速数据抓取,asyncio是一个异步IO库,运行效率较高,需要的朋友可以参考下
    2015-04-04
  • python计算文本文件行数的方法

    python计算文本文件行数的方法

    这篇文章主要介绍了python计算文本文件行数的方法,涉及Python针对文本文件的读取与行数统计相关技巧,需要的朋友可以参考下
    2015-07-07
  • 三大Python翻译神器再也不用担心学不好英语

    三大Python翻译神器再也不用担心学不好英语

    本文介绍了用python做一款属于自己的翻译词典软件,从此告别网页搜索,文中有非常详细的代码示例,小伙伴们快快行动吧,需要的朋友可以参考下
    2021-09-09

最新评论