如何在Python中创造动画?

如何在Python中创造动画?

在现代科技发展的今天,动画已不再是一些儿童节目的专利,各种领域的可视化也开始广泛采用动画效果。Python是一门功能强大的编程语言,它有丰富的图形化库和动画绘制工具,使得我们可以轻松地在Python中创造生动有趣的动画。

本文将介绍如何用Python创造动画,包括绘制图形、增加动画效果、改变图形颜色、大小、位置等,以及将动画渲染为视频。

1. 绘制图形

Python的图形化库非常丰富,比如matplotlib、bokeh、plotly、turtle等等。在这里我们选用matplotlib绘制基本的图形,其中最常见的图形类型包括:点、线、面、矩形、圆、椭圆等等。

绘制点:

import matplotlib.pyplot as plt

plt.scatter([0,1,2,3], [4,5,6,7])

plt.show()

绘制线:

import matplotlib.pyplot as plt

plt.plot([0,1,2,3], [4,5,6,7])

plt.show()

绘制面:

import matplotlib.pyplot as plt

plt.fill_between([0,1,2,3], [4,5,6,7], alpha=0.5)

plt.show()

绘制矩形:

import matplotlib.pyplot as plt

rect = plt.Rectangle((0.2, 0.3), 0.4, 0.3, color='blue', alpha=0.3)

plt.gca().add_patch(rect)

plt.show()

绘制圆:

import matplotlib.pyplot as plt

import matplotlib.patches as patches

circle = patches.Circle((0.5, 0.5), 0.3, color='red', alpha=0.3)

plt.gca().add_patch(circle)

plt.show()

绘制椭圆:

import matplotlib.pyplot as plt

import matplotlib.patches as patches

ellipse = patches.Ellipse((0.5, 0.5), 0.5, 0.3, angle=30, color='green', alpha=0.3)

plt.gca().add_patch(ellipse)

plt.show()

2. 增加动画效果

在Python中增加动画效果主要是通过FuncAnimation和ArtistAnimation两个类实现的,其中FuncAnimation基于数据采样,ArtistAnimation则通过预先定义好的绘制好的艺术家对象构建。这两种方式都可以很方便地使用,但需要注意的是,ArtistAnimation的效率会更高一些,因为它只需要更新与动画对象相关的图形。

FuncAnimation

我们来看一个简单的示例,以热气球升起为主题进行动画制作。首先我们先绘制热气球:

import matplotlib.pyplot as plt

import numpy as np

import matplotlib.patches as patches

fig, ax = plt.subplots()

circle = patches.Circle((0.5, 0.5), 0.1, color='red')

rect = patches.Rectangle((0.4, 0), 0.2, 0.4, color='yellow')

line = plt.Line2D([0.5, 0.5], [0.4, 0.8], color='black')

ax.add_patch(circle)

ax.add_patch(rect)

ax.add_line(line)

plt.axis('equal')

plt.show()

接下来我们使用FuncAnimation制作升起热气球的动画,代码如下:

import matplotlib.pyplot as plt

import numpy as np

import matplotlib.patches as patches

from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()

circle = patches.Circle((0.5, 0.5), 0.1, color='red')

rect = patches.Rectangle((0.4, 0), 0.2, 0.4, color='yellow')

line = plt.Line2D([0.5, 0.5], [0.4, 0.8], color='black')

ax.add_patch(circle)

ax.add_patch(rect)

ax.add_line(line)

def update(frame):

circle.center = (0.5, 0.5 + frame * 0.02)

rect.set_y(0.4 + frame * 0.02)

line.set_ydata([0.4 + frame * 0.02, 0.8 + frame * 0.02])

ani = FuncAnimation(fig, update, frames=np.arange(100), interval=50)

plt.axis('equal')

plt.show()

代码分析:

– frames:数列或者迭代器,逐个取出用于绘制每一帧画面;

– interval:两帧动画之间的间隔时间。

ArtistAnimation

类似于FuncAnimation,我们还可以使用ArtistAnimation来构建动画效果。但不同的是,它不是动态生成每一帧,而是事先定义好所有图形对象,并把它们作为一段动画播放出来。代码如下:

import matplotlib.pyplot as plt

import numpy as np

import matplotlib.patches as patches

from matplotlib.animation import ArtistAnimation

fig, ax = plt.subplots()

circle = patches.Circle((0.5, 0.5), 0.1, color='red')

rect = patches.Rectangle((0.4, 0), 0.2, 0.4, color='yellow')

line = plt.Line2D([0.5, 0.5], [0.4, 0.8], color='black')

ax.add_patch(circle)

ax.add_patch(rect)

ax.add_line(line)

frames = []

for i in range(100):

circle.center = (0.5, 0.5 + i * 0.02)

rect.set_y(0.4 + i * 0.02)

line.set_ydata([0.4 + i * 0.02, 0.8 + i * 0.02])

frames.append([circle, rect, line])

ani = ArtistAnimation(fig, frames, interval=50)

plt.axis('equal')

plt.show()

3. 改变图形颜色、大小和位置

除了上面所介绍的基本方法,我们还可以利用Python提供的各种函数来改变图形的颜色、大小和位置。这里介绍几个常见的函数。

改变图形颜色:

# 改变圆形颜色

circle.set_color('blue')

# 改变矩形填充颜色

rect.set_facecolor('green')

改变图形大小:

# 改变圆形大小

circle.set_radius(0.2)

# 改变矩形大小rect.set_width(0.4)

rect.set_height(0.6)

改变图形位置:

# 改变圆形位置

circle.center = (0.3, 0.3)

# 改变矩形位置

rect.set_x(0.3)

rect.set_y(0.3)

在上述案例中,举个例子,我们可以在动画过程中修改circle.center,这将使整个圆形移动到新的位置,如下:

import matplotlib.pyplot as plt

import numpy as np

import matplotlib.patches as patches

from matplotlib.animation import ArtistAnimation

fig, ax = plt.subplots()

circle = patches.Circle((0.3, 0.3), 0.1, color='red')

rect = patches.Rectangle((0.4, 0), 0.2, 0.4, color='yellow')

line = plt.Line2D([0.5, 0.5], [0.4, 0.8], color='black')

ax.add_patch(circle)

ax.add_patch(rect)

ax.add_line(line)

frames = []

for i in range(100):

circle.center = (0.3 + i * 0.01, 0.3 + i * 0.02) # 修改圆的位置

rect.set_y(0.4 + i * 0.02)

line.set_ydata([0.4 + i * 0.02, 0.8 + i * 0.02])

frames.append([circle, rect, line])

ani = ArtistAnimation(fig, frames, interval=50)

plt.axis('equal')

plt.show()

4. 将动画渲染为视频

动画制作好了,我们通常会把它导出为视频进行分享或发布。在Python中,我们可以使用matplotlib.animation模块中的writers类将动画导出为各种格式的视频,包括GIF、MP4、AVI等。

以mp4格式为例,代码如下:

import matplotlib.pyplot as plt

import numpy as np

import matplotlib.patches as patches

from matplotlib.animation import ArtistAnimation

from matplotlib.animation import PillowWriter

fig, ax = plt.subplots()

...

ani = ArtistAnimation(fig, frames, interval=50)

writer = PillowWriter(fps=20, metadata=dict(artist='Me'), bitrate=1800)

ani.save('balloon.mp4', writer=writer)

代码中,我们使用了PillowWriter将动画导出为mp4格式,并将其保存在当前目录下的balloon.mp4文件中。

总结

本文介绍了如何在Python中创造动画,包括绘制基本图形、增加动画效果、修改图形颜色、大小和位置,以及将动画导出为视频。通过学习本文所介绍的知识,我们可以通过Python轻松地创造动画,并将其应用到各种领域中。