如何在Python中创建动画?


Python 提供了几个用于创建动画的库,例如 Matplotlib、Pygame 和 Pyglet。Matplotlib 是一个流行的 Python 数据可视化库,它也提供了使用“FuncAnimation”函数创建动画的功能。“FuncAnimation”是“matplotlib.animation”模块中的一个类,它通过调用用户定义的函数来创建动画。在本教程中,我们将学习使用“FuncAnimation”函数创建动画,并演示此方法的三个示例。

语法

animation = FuncAnimation(fig, animate_func, frames=frame_values, interval=interval_value, repeat=repeat_value)

在上面的语法中,fig 是我们要动画化的对象,animate_func 更新每一帧的绘图,“frame_values”是确定要显示的帧的可迭代值,“interval_value”是帧之间的时间间隔(以毫秒为单位),“repeat_value”是一个布尔值,它决定动画是否在结束后重复。

示例 1

在这个例子中,我们使用“subplots()”函数创建了一个图形对象“fig”和一个“an”坐标轴对象 ax。接下来,我们创建了一个包含 0 到 2π 之间 200 个点的 numpy 数组“x”,以及一个绘制“x”正弦值的线对象“line”。

动画的每一帧都会调用“animate()”函数,它通过向“x”添加“i/10.0”来更新“line”对象的 y 数据。然后,该函数返回“line”对象。之后,我们通过传递“fig”、“animate”、“frames=100”(表示我们要显示 100 帧)和“interval=50”(将帧之间的时间间隔设置为 50 毫秒)来创建“FuncAnimation”的实例。然后,我们调用“plt.show()”来显示动画。

这是一个创建正弦波动画的简单示例:

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

fig, ax = plt.subplots()
x = np.linspace(0, 2*np.pi, 200)
line, = ax.plot(x, np.sin(x))

def animate(i):
   line.set_ydata(np.sin(x + i/10.0))
   return line,
animation = FuncAnimation(fig, animate, frames=100, interval=50)
plt.show()

输出

示例 2

在这个例子中,我们使用“FuncAnimation”动画化了一个在绘图中间垂直滚动的球。首先,我们使用“plt.Circle()”创建了一个“circle”对象,在“init()”函数中设置了“ax”的 x 和 y 限制,并将“circle”对象添加到坐标轴。在“animate()”函数中,使用“i”变量更新“circle”的垂直位置,并返回“circle”对象。

然后,使用“fig”、“animate”、“init_func=init”、“frames=100”、“interval=20”和“blit=True”创建 FuncAnimation 的实例。然后使用“plt.show()”显示动画。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots()
circle = plt.Circle((0, 0), 1, fc='r')

def init():
   ax.set_xlim(-10, 10)
   ax.set_ylim(-10, 10)
   ax.add_artist(circle)
   return circle,

def animate(i):
   x, y = circle.center
   circle.center = (x, i/5)
   return circle,

animation = FuncAnimation(fig, animate, init_func=init, frames=100, interval=20, blit=True)
plt.show()                

输出

示例 3

在这个例子中,我们动画化了两条水平移动的线。首先,我们创建了一个图形对象“fig”和一个坐标轴对象“ax”。然后,我们定义了两个线对象“x1_line”和“x2_line”,它们代表两条水平移动的线。

调用“init()”函数来初始化绘图。我们设置“ax”的 x 和 y 限制,并返回“x1_line”和“x2_line”对象。接下来,动画的每一帧都会调用“animate()”函数,它更新“x1_line”和“x2_line”对象的数据。我们生成一个包含 0 到 10 之间 100 个点的 numpy 数组“x1”,以及一个幅度为 1、相移为 -i/10.0 的正弦波 numpy 数组“y1”。然后,我们将“x1_line”的 x 数据设置为“x1”,y 数据设置为“y1”。

类似地,我们生成一个包含 0 到 10 之间 100 个点的 numpy 数组“x2”,以及一个幅度为 1、相移为 -i/10.0 的余弦波 numpy 数组“y2”。然后,我们将“x2_line”的 x 数据设置为“x2”,y 数据设置为“y2”。然后,我们通过传递“fig”、“animate”、“init_func=init”、“frames=100”(表示 100 帧)和“interval=50”(将帧之间的时间间隔设置为 50 毫秒)来创建“FuncAnimation”的实例。我们还设置“blit=True”以提高性能。然后,我们调用“plt.show()”进行显示。

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

fig, ax = plt.subplots()
x1_line, = ax.plot([], [])
x2_line, = ax.plot([], [])

def init():
   ax.set_xlim(0, 10)
   ax.set_ylim(-1, 1)
   return x1_line, x2_line

def animate(i):
   x1 = np.linspace(0, 10, 100)
   y1 = np.sin(x1 - i/10.0)
   x1_line.set_data(x1, y1)
   x2 = np.linspace(0, 10, 100)
   y2 = np.cos(x2 - i/10.0)
   x2_line.set_data(x2, y2)
   return x1_line, x2_line

animation = FuncAnimation(fig, animate, init_func=init, frames=100, interval=50, blit=True)
plt.show()

输出

结论

我们了解到 Matplotlib 是 Python 中流行的数据可视化库,使用“FuncAnimation”创建动画可以让我们基本了解如何使用 Matplotlib 创建绘图并对其进行自定义。在 Python 中使用“FuncAnimation”创建动画是了解动画工作原理以及如何使用 Matplotlib 创建引人入胜的可视化效果的好方法。通过创建动画,可以增强 Python 编程技能,并通过解决诸如更新每一帧的绘图、控制动画速度以及处理错误和异常等挑战来培养解决问题的能力。此外,创建动画还可以发挥创造力和创新性,因为可以设计出视觉上吸引人且交互式的动画,以有效地传达复杂的数据和概念。总而言之,我们可以使用此方法创建动画并对其进行进一步自定义。

更新于:2023年5月10日

9K+ 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告