创作背景
最近本菜鸡在使用 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
制作同步动画。
实现思路
- 创建
Figure
对象。用于显示动画。 - 初始化两个
Line2D
对象。分别对应 y = s i n ( x ) y=sin(x) y=sin(x) 和 y = c o s ( x ) y=cos(x) y=cos(x) 。 - 构造更新函数。更新函数要根据动画的每帧更新图形。
- 创建动画。使用
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
为有 2
个 Line2D
对象的列表,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
的小伙伴可以 私信我
进群哦。
以上就是我要分享的内容,因为 学识尚浅,会有不足,还 请各位大佬指正。
有什么问题也可在评论区留言。