使用 animation.FuncAnimation 制作同一画布多条曲线同时动画

创作背景

最近本菜鸡在使用 animation.FuncAnimation 制作动图,写下此篇博客以记录。
如果觉得我这篇文章写的好的话,能不能给我 点个赞评论收藏 一条龙(☆▽☆)。如果要点个 关注 的话也不是不可以🤗。
请各位参加一下文末的 投票 哦,如果 有什么不足之处,还 请各位大佬在评论区提出,不胜感激。

任务需求

在同一块画布中,绘制 y = s i n ( x ) y=sin(x) y=sin(x) y = c o s ( x ) y=cos(x) y=cos(x) 两条曲线,并使用 animation.FuncAnimation 制作同步动画。

实现思路

  1. 创建 Figure 对象。用于显示动画。
  2. 初始化两个 Line2D 对象。分别对应 y = s i n ( x ) y=sin(x) y=sin(x) y = c o s ( x ) y=cos(x) y=cos(x)
  3. 构造更新函数。更新函数要根据动画的每帧更新图形。
  4. 创建动画。使用 animation.FuncAnimation 实现曲线的更新。

实现代码

首先我们需要导入所需要的库。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

其中:

  • np 用于 生成数列
  • plt 用于 创建 Figure 对象初始化曲线
  • animation 用于 制作动图
    注:如果要在 jupyter notebook 中查看的话,需要在最前边加上一句
%matplotlib notebook

第一步

fig, ax = plt.subplots()
fig.set_size_inches(5, 5)

其中,fig 即为 Figure 对象,set_size_inches 可以设置其大小。

第二步

ln = plt.plot([], [], 'ro', [], [], 'b.')

def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)
    return ln,

其中,ln 为有 2Line2D 对象的列表,init初始化函数 ,可作为参数传给 FuncAnimation 对象。

第三步

def update(frame):
    ln[0].set_data(frame, np.sin(frame))
    ln[1].set_data(frame, np.cos(frame))
    return ln

其中,set_data 函数可以改变点的位置,即 “更新”。

第四步

ani = animation.FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128), intervel=100, init_func=init, blit=False)
plt.show()

其中,frames 参数为 每帧动画传递给更新函数的参数 ,用于 图像更新

额外一步

如果想要保存为 gif 动图的话,就加一句

ani.save('【文件名】.gif', writer='imagemagick', fps=10)

这里的文件名称自行设置。

效果

来看一下效果吧
请添加图片描述

修改

从上图可以看出,我们的动画很成功的完成了。
但有个问题,如果我想看点已经运动的轨迹,应该怎么办呢?
这时候就需要 保存每个点每次运动的位置
代码修改如下(仅修改 update 函数):

points = [[], []]

def update(frame):
    for i, func in enumerate([np.sin, np.cos]):
        points[i].append([frame, func(frame)])
        ln[i].set_data(zip(*points[i]))
    return ln

来看一下这时候的效果吧。
请添加图片描述
成功完成任务!!!




结尾

有想要一起学习 python 的小伙伴可以 私信我 进群哦。

以上就是我要分享的内容,因为 学识尚浅会有不足,还 请各位大佬指正
有什么问题也可在评论区留言。
在这里插入图片描述

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值