如何在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轻松地创造动画,并将其应用到各种领域中。