使用Matplotlib绘制一条螺旋曲线,如下图:
跟前面的例子是一样的,采用回调函数的方式来实现,首先要导入动画库:
from matplotlib import animation
这样就可以使用animation的功能了,最重要的是使用animation.FuncAnimation和animation.FFMpegWriter函数。
接着定义重复时的清空函数:
def init():
global xdata, ydata
xdata, ydata = [], []
line.set_data([], [])
return line,
每次重复开始时,需要把全局变量xdata和ydata清空,否则绘图数据已经在变量里,就看不到绘图更新了,因为一次性就已经把整个图绘完了。这里调用set_data函数来清空绘图区域。
再定义动画更新函数:
def animate(i):
# t 帧序号
t = 0.1 * i
# x, y 绘图
x = t * np.sin(t)
y = t * np.cos(t)
# 增加到列表,连接起所有点。
xdata.append(x)
ydata.append(y)
line.set_data(xdata, ydata)
return line,
在这段代码里,通过帧号的改变来计算参数t,而参数t用来计算圆的坐标,再把这个坐标添加全局变量里保存,最后根据所有坐标点进行绘图,就可以不断地更新图案。
anim = animation.FuncAnimation(fig, animate, init_func = init,
frames = 500, interval = 20, blit = True)
这行代码是设置动画回调函数,fig是绘图区域,animate是回调更新函数,init是重复时调用的函数,frames是500帧长度,interval是间隔20毫秒更新一帧。
把前面的代码进行综合,就可以构造成完整的例子:
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
plt.rcParams['animation.ffmpeg_path'] = r'D:\ffmpeg-2020-12-20\bin\ffmpeg.exe'
# 创建绘图轴对象,创建一个空白窗口
fig = plt.figure()
axis = plt.axes(xlim =(-50, 50), ylim =(-50, 50))
line, = axis.plot([], [], lw = 2)
#创建全局数据保存列表
xdata, ydata = [], []
#定义每次重复清空函数
def init():
global xdata, ydata
xdata, ydata = [], []
line.set_data([], [])
return line,
#每帧动画更新函数
def animate(i):
# t 帧序号
t = 0.1 * i
# x, y 绘图
x = t * np.sin(t)
y = t * np.cos(t)
# 增加到列表,连接起所有点。
xdata.append(x)
ydata.append(y)
line.set_data(xdata, ydata)
return line,
anim = animation.FuncAnimation(fig, animate, init_func = init,
frames = 500, interval = 20, blit = True)
#保存的动画视频文件名为当前文件夹下的ani-055.mp4,帧率为20帧每秒,格式为MP4。
FFwriter = animation.FFMpegWriter(fps=20, extra_args=['-vcodec', 'libx264'],
metadata = {'title':'demo', 'artist':'蔡军生'})
anim.save('ani-055.mp4', writer = FFwriter)
plt.show() # 会一直循环播放动画
当你运行完成时,就可以到源码所在的目录找到ani-055.mp4文件,点击播放就可以看到整个动画过程的视频了。