Python制作酷炫的动画效果

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算法资讯。
在这里插入图片描述
注: 完整代码,关注公众号,后台回复 动画 , 即可获取。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵卓不凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值