【matplotlib基础】--动画

matplotlib,基础 · 浏览次数 : 0

小编点评

** matplotlib 的动画功能简介** matplotlib 的动画功能允许您将动画添加到您的 matplotlib 图形中。 matplotlib 提供两种主要的动画函数:**FuncAnimation** 和 **ArtistAnimation**。 ** FuncAnimation** * 使用回调函数不断重绘图形,以达到动画的效果。 * 需要传入画布、回调函数、间隔时间和帧数量等参数。 * 可以使用 **FuncAnimation** 函数轻松地创建一个动画。 ** ArtistAnimation** * 先准备每一帧的数据,然后绘制按照一定的时间间隔绘制每一帧数据对应的图像。 * 不需要传入回调函数,但需要准备每个帧的数据。 * 可以使用 **ArtistAnimation** 函数绘制各种图形,包括曲线、图像等。 ** 动画导出** * matplotlib 可以导出动画到 MP4 和 GIF 格式。 * MP4 格式需要使用 ffmpeg 工具进行导出。 * GIF 格式可以使用 imagemagick 工具进行导出。

正文

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))

11.gif

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))

11-3.gif

2. 动画函数

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

2.1. FuncAnimation

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

  1. 画布:比如上面第一个示例中的 fig
  2. 回调函数:比如上面第一个示例中的 update
  3. 调用回调函数的间隔:比如上面第一个示例中的 interval=50,单位是毫秒
  4. 调用回调函数的次数:比如上面第一个示例中的 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)

11-2.gif

ArtistAnimation的主要参数:

  1. 画布:比如上面示例中的 fig
  2. 每一帧的数据:比如上面示例中的 frames
  3. 每一帧的间隔:比如上面示例中的 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基础】--动画

matplotlib的动画一直是一个强大但使用频率不高的功能,究其原因,一方面展示动画需要一定的媒介,没有图形和文字展示方便;二来大家更关心的是分析结果的最终图表,图表的动态展示则没有那么重要。 不过,随着短视频的兴起,在短视频平台上展示动画变得非常容易,所以,我们发现有越来越多的数据分析动画(比如

【matplotlib基础】--子图

使用Matplotlib对分析结果可视化时,比较各类分析结果是常见的场景。在这类场景之下,将多个分析结果绘制在一张图上,可以帮助用户方便地组合和分析多个数据集,提高数据可视化的效率和准确性。 本篇介绍Matplotlib绘制子图的常用方式和技巧。 1. 添加子图的方式 添加子图主要有两种方式,一种是

【matplotlib基础】--画布

Matplotlib 库是一个用于数据可视化和绘图的 Python 库。它提供了大量的函数和类,可以帮助用户轻松地创建各种类型的图表,包括直方图、箱形图、散点图、饼图、条形图和密度图等。 使用 Matplotlib 的过程中,遇到的难点并不在于绘制各类的图形,因为每种图形都有其对应的API。难点在于

【matplotlib基础】--坐标轴

Matplotlib的坐标轴是用于在绘图中表示数据的位置的工具。 坐标轴是图像中的水平和垂直线,它们通常表示为 x 轴和 y 轴。坐标轴的作用是帮助观察者了解图像中数据的位置和大小,通常标有数字或标签,以指示特定的值在图像中的位置。 1. 坐标轴范围 Matplotlib绘制图形时,会自动根据X,Y

【matplotlib基础】--刻度

Matplotlib中刻度是用于在绘图中表示数据大小的工具。 刻度是坐标轴上的数字或标签,用于指示数据的大小或值,通常以整数或小数表示,具体取决于坐标轴的类型和限制。 1. 主次刻度 默认的绘制时,坐标轴只有默认的主要刻度,如下所示: from matplotlib.ticker import Mu

【matplotlib基础】--图例

Matplotlib 中的图例是帮助观察者理解图像数据的重要工具。图例通常包含在图像中,用于解释不同的颜色、形状、标签和其他元素。 1. 主要参数 当不设置图例的参数时,默认的图例是这样的。 import numpy as np import matplotlib.pyplot as plt x =

【matplotlib基础】--文本标注

Matplotlib 文本和标注可以为数据和图形之间提供额外的信息,帮助观察者更好地理解数据和图形的含义。 文本用于在图形中添加注释或提供更详细的信息,以帮助观察者理解图形的含义。标注则是一种更加细粒度的文本信息,可以被用来为特定的数据点或区域提供更详细的信息。 本篇通过示例依次介绍文本和标注的常用

【matplotlib基础】--绘图配置

Matplotlib 提供了大量配置参数,这些参数可以但不限于让我们从整体上调整通过 Matplotlib 绘制的图形样式,这里面的参数还有很多是功能性的,和其他工具结合时需要用的配置。 通过plt.rcParams,可以查看所有的配置信息: import matplotlib.pyplot as

【matplotlib基础】--样式表

Matplotlib库 由于诞生的比较早,所以其默认的显示样式很难符合现在的审美,这也是它经常为人诟病的地方。 不过,经过版本更迭之后,现在 Matplotlib 已经内置了很多样式表,通过使用不同的样式表,可以整体改变绘制图形的风格,不用再调整一个个显示参数。 1. 样式表的使用 1.1. 所有内

【matplotlib基础】--手绘风格

Matplotlib 中有一个很有趣的手绘风格。如果不是特别严肃的分析报告,使用这个风格能给枯燥的数据分析图表带来一些活泼的感觉。 使用手绘风格非常简单,本篇主要手绘风格的效果以及如何配置中文的支持。 1. 中文支持 Matplotlib 的手绘风格默认是不支持中文的,中文在图形中会显示成方格子。如