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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程