📜  使用 Matplotlib 制作动画

📅  最后修改于: 2022-05-13 01:55:38.889000             🧑  作者: Mango

使用 Matplotlib 制作动画

Python的 Matplotlib 库是一个绘图工具,用于绘制函数或图形的图形。它也可以用作动画工具。添加动画后绘制的图表提供了更强大的可视化效果,并帮助演示者吸引更多观众。 Matplotlib 还可以轻松与 Pandas 连接以创建更复杂的动画。

Matplotlib 中的动画可以通过两种方式使用Animation类来制作:

  • 通过一遍又一遍地调用一个函数:它使用一个预定义的函数,当它一次又一次地运行时会创建一个动画。
  • 通过使用固定对象:一些动画艺术对象与其他对象结合产生动画场景。

需要注意的是,我们必须始终保持对动画对象的引用,否则动画将停止。这是因为Animation class拥有对动画对象的单个指针引用,并且随着时间的推移运行动画,这个指针引用必须保留,否则它将被作为垃圾值收集。

虽然有两种方式,第一种方式更常用也更方便,这里我们只使用它。但是,您也可以在此处阅读其他人的文档。

让我们深入了解 Matplotlib 动画。

让我们看一个例子。在这里,我们将尝试使用动画和绘图工具制作连续的正弦波。为此,我们将使用matplotlib中的numpypyplot 。如前所述,我们将使用函数方法而不是艺术对象。

注意:要将动画保存到您的计算机,请使用anim.save(filename)Animation.to_html5_video

from matplotlib import pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation 
   
# initializing a figure in 
# which the graph will be plotted
fig = plt.figure() 
   
# marking the x-axis and y-axis
axis = plt.axes(xlim =(0, 4), 
                ylim =(-2, 2)) 
  
# initializing a line variable
line, = axis.plot([], [], lw = 3) 
   
# data which the line will 
# contain (x, y)
def init(): 
    line.set_data([], [])
    return line,
   
def animate(i):
    x = np.linspace(0, 4, 1000)
   
    # plots a sine graph
    y = np.sin(2 * np.pi * (x - 0.01 * i))
    line.set_data(x, y)
      
    return line,
   
anim = FuncAnimation(fig, animate, init_func = init,
                     frames = 200, interval = 20, blit = True)
  
   
anim.save('continuousSineWave.mp4', 
          writer = 'ffmpeg', fps = 30))

首先,在导入必需品后,我们设置一个空白图形或空白窗口,将在其上绘制整个动画。接下来我们初始化一个变量line ,它将包含绘图的 x 和 y 坐标。这些最初是空的,因为其中的数据会因为动画而不断变化。最后,我们声明动画函数animate(i) ,它接受一个参数i ,其中i被称为帧号,并使用它创建正弦波(或任何其他图形),它将根据i的值不断变化。在最后一行anim = FuncAnimation(fig, animate, init_func=init, frames=200, interval=20, blit=True)我们使用FuncAnimation函数创建一个动画,它每秒显示 200 帧,间隔为 20微秒。

输出 :

现在这是一个非常强大的可视化。需要注意的一点是,当我们查看保存的 gif 时,它将是一个连续的剪辑,不像我们输出中的视频会在几秒钟内终止。让我们再看一个例子。在我们编写程序时尝试猜测输出,因为它会清除我们的概念。

import matplotlib.animation as animation 
import matplotlib.pyplot as plt 
import numpy as np 
  
   
# creating a blank window
# for the animation 
fig = plt.figure() 
axis = plt.axes(xlim =(-50, 50),
                ylim =(-50, 50)) 
  
line, = axis.plot([], [], lw = 2) 
   
# what will our line dataset
# contain?
def init(): 
    line.set_data([], []) 
    return line, 
   
# initializing empty values
# for x and y co-ordinates
xdata, ydata = [], [] 
   
# animation function 
def animate(i): 
    # t is a parameter which varies
    # with the frame number
    t = 0.1 * i 
       
    # x, y values to be plotted 
    x = t * np.sin(t) 
    y = t * np.cos(t) 
       
    # appending values to the previously 
    # empty x and y data holders 
    xdata.append(x) 
    ydata.append(y) 
    line.set_data(xdata, ydata) 
      
    return line,
   
# calling the animation function     
anim = animation.FuncAnimation(fig, animate, init_func = init, 
                               frames = 500, interval = 20, blit = True) 
   
# saves the animation in our desktop
anim.save('growingCoil.mp4', writer = 'ffmpeg', fps = 30)

正如我们可能已经猜到的那样,正如保存的文件名所暗示的那样,它是一个不断增长的线圈的动画。和之前一样,我们首先导入所有模块。但这一次,我们完全导入了matplotlib.animation

import matplotlib.animation as animation

但是,在前面的示例中,我们只从中导入了FuncAnimation函数

from matplotlib.animation import FuncAnimation

但是,这并没有真正进行任何更改,并且可以选择任何导入方式。然后我们创建一个将放置动画的图形。 animate函数随帧号i变化。要知道的一件事是,线圈不过是正弦和余弦的复合函数。我们在 x 轴上取正弦函数,在 y 轴上取 cos 函数,结果图给出了一个线圈。

输出:

因此,我们得出结论,使用matplotlib的一些基本知识可以制作出许多有趣的动画。当一个人需要在不使用诸如 Blender 等更高级别的动画工具的情况下呈现一些具有额外动画功能的可视化时,这真的很方便。