1 引言
利用Python的Matplotlib-Animation库可以制作酷炫的数学公式动画,官方教程可访问链接.
本文为了清晰说明如何利用Animation类来实现动画效果,这里采用介绍一个点沿cos函数运动的例子来进行详细说明,其他复杂的动画效果也可据此原理进行类比扩展.
cos函数点运动示例 |

二阶钟摆示例 |
2 动画实现
这里主要以讲述上面的cos函数点运动的动画实现.
2.1 准备背景
在绘制动画前,我们需要将cos函数的背景图绘制出来. 这一步很简单,与我们平常使用matplotlib绘图一样.
def test1():
x = np.linspace(0,2*np.pi,100)
y = np.cos(x)
fig = plt.figure()
plt.plot(x,y)
plt.grid(ls='--')
plt.savefig("cos_test1.png")
plt.show()
结果如下:
2.2 往背景中添加动画点
这一步我们使用animation库,往代码里添加动画点,我们先看代码,然后进行解释:
def update_points(num):
point_ani.set_data(x[num], y[num])
return point_ani,
def test2():
global point_ani,x,y
x = np.linspace(0, 2 * np.pi, 100)
y = np.cos(x)
fig = plt.figure()
plt.plot(x, y)
point_ani, = plt.plot(x[0], y[0], "ro")
plt.grid(ls="--")
ani = animation.FuncAnimation(fig, update_points, np.arange(0, 100), interval=100, blit=True)
ani.save('cos_test2.gif', writer='imagemagick', fps=10)
plt.show()
结果如下:
[解释]
上述代码中,首先定义了一个函数 update_points ,该函数主要用于更新绘制图像中的数据点. 此函数的输入参数 num 代表当前动画的第几帧,函数的返回,即为我们需要更新的对象.接下来就是将该函数传入到FuncAnimation函数中,其主要参数介绍如下:
- fig: 当前我们绘图对象
- update_points: 更新动画的函数
- np.arange(0,100): 动画帧数,这里需要是一个可以迭代的对象
- interval: 动画的时间间隔
- bit: 是否开启动画渲染
2.3 往背景中添加动画样式
上面代码所实现的动画效果相对来说比较单一,查阅官方文档后,我们可以继续往其中添加一些文本显示,或者在不同的条件下改变点样式。
想要达到上述效果也非常容易,只需在update_points函数中添加一些额外的代码控制逻辑即可。
def update_points_v2(num):
if num % 5 == 0:
point_ani.set_marker("*")
point_ani.set_markersize(12)
else:
point_ani.set_marker("o")
point_ani.set_markersize(8)
point_ani.set_data(x[num], y[num])
text_pt.set_text("x=%.2f, y=%.2f" % (x[num], y[num]))
return point_ani, text_pt,
def test3():
global x,y,point_ani,text_pt
x = np.linspace(0, 2 * np.pi, 100)
y = np.cos(x)
fig = plt.figure()
plt.plot(x, y)
point_ani, = plt.plot(x[0], y[0], "ro")
plt.grid(ls="--")
text_pt = plt.text(4, 0.8, '', fontsize=16)
ani = animation.FuncAnimation(fig, update_points_v2, np.arange(0, 100), interval=100, blit=True)
ani.save('cos_test3.gif', writer='imagemagick', fps=10)
plt.show()
在函数update_points_v2中,我们添加了文本显示,显示移动点(x,y)的坐标值,同时我们实现了每隔5个点,我们将显示点的形状由圆点修改为五角星形状.结果如下:
观察上面的图像,我们希望显示的文本可以随着点的移动而移动,此时我们只需将更新动画函数修改成如下形式即可:
def update_points_v3(num):
point_ani.set_data(x[num], y[num])
if num % 5 == 0:
point_ani.set_marker("*")
point_ani.set_markersize(12)
else:
point_ani.set_marker("o")
point_ani.set_markersize(8)
text_pt.set_position((x[num], y[num]))
text_pt.set_text("x=%.2f, y=%.2f" % (x[num], y[num]))
return point_ani, text_pt,
最终效果展示如下:
3 总结
本文以cos函数为例进行讲解,一步一步地实现了点随cos曲线运动的动画效果,方便童鞋们熟悉Matplotlib的Animation类的基本使用方法,了解Python制作动画效果的背后原理.
您学废了嘛?
4 参考
关注公众号《AI算法之道》,获取更多AI算法资讯。
注: 完整代码,关注公众号,后台回复 动画 , 即可获取。