Matplotlib FuncAnimation方式创建动画

前面学习了基本的动画的过程,接着下来继续通过例子来学习动画的各种方式,以便可以应用到实际工作环境中,只需要修改其中的数据,就可以适用于自己的需求。

假定在做实验中,做了5次实验,因此得到5次数据,需要把这5次数据进行动态化显示,怎么办呢?现在针对这个问题来进行思考,写出解决的代码。这5次的数据如下:

[[2.00000000e-01, 2.00000000e-01, 2.75495888e-02, 1.40100625e-02, 2.00000000e-01],

[1.40100625e-02, 3.85989938e-01, 6.20454173e-03, 1.74945474e-03, 2.00000000e-01],

[1.74945474e-03, 3.98250545e-01, 1.24956950e-03, 2.30229281e-04, 2.00000000e-01],

[2.30229281e-04, 3.99769771e-01, 2.26476892e-04, 3.05018276e-05, 2.00000000e-01],

[3.05018276e-05, 3.99969498e-01, 3.82455658e-05, 4.04459287e-06, 2.00000000e-01]]

现在可以考虑把5个点作为X轴的坐标,然后每次显示5个点,接着循环显示5帧,就可以看到数据的变化了。因此生成X轴的坐标代码如下:

x = list(range(0, 5))

这里使用列表生成0到4的X轴坐标值。

接着定义Y轴的数据:

y = [[2.00000000e-01, 2.00000000e-01, 2.75495888e-02, 1.40100625e-02, 2.00000000e-01],

[1.40100625e-02, 3.85989938e-01, 6.20454173e-03, 1.74945474e-03, 2.00000000e-01],

[1.74945474e-03, 3.98250545e-01, 1.24956950e-03, 2.30229281e-04, 2.00000000e-01],

[2.30229281e-04, 3.99769771e-01, 2.26476892e-04, 3.05018276e-05, 2.00000000e-01],

[3.05018276e-05, 3.99969498e-01, 3.82455658e-05, 4.04459287e-06, 2.00000000e-01]]

有了X轴和Y轴的数据,就可以进行显示了。

先显示第一组数据:

sc = ax.scatter(x,y[0])

plt.ylim(-0.1,0.5)

这里通过X轴的5个坐标点与Y轴第一组数据,就可以画出来5个点来。

接着下来,跟前面的例子一样,定义动画函数,在这里没有初始化函数:

def animate(i):
sc.set_offsets(np.c_[x,y[i]])

在这行代码里,使用np.c_来拼接成坐标数据,然后使用set_offsets绘制整个路径的数据。

anim = animation.FuncAnimation(fig, animate,
frames=len(y), interval=300, repeat=True)

这里调用动画FuncAnimation函数来设置回调函数animate,fig是绘图的画布,帧数frames由5组数据量决定,每帧延时interval是300毫秒,repeat是重复播放。

到这里就解决了显示5组实验数据的例子,后面的代码是生成MP4文件,跟前面的例子是一样,如果不懂,或者不能运行,请参考前文。

例子的结果:

Matplotlib FuncAnimation方式创建动画

整个例子的代码如下:

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

plt.rcParams['animation.ffmpeg_path'] = 'D:\\ffmpeg-2020-12-20\\bin\\ffmpeg.exe'


x = list(range(0, 5))
y = [[2.00000000e-01,   2.00000000e-01,   2.75495888e-02, 1.40100625e-02,   2.00000000e-01],
     [1.40100625e-02,   3.85989938e-01,   6.20454173e-03, 1.74945474e-03,   2.00000000e-01],
     [1.74945474e-03,   3.98250545e-01,   1.24956950e-03, 2.30229281e-04,   2.00000000e-01], 
     [2.30229281e-04,   3.99769771e-01,   2.26476892e-04, 3.05018276e-05,   2.00000000e-01],
     [3.05018276e-05,   3.99969498e-01,   3.82455658e-05, 4.04459287e-06,   2.00000000e-01]]

# 创建绘图轴对象
fig, ax = plt.subplots()

sc = ax.scatter(x,y[0])
plt.ylim(-0.1,0.5)
# 动画绘制函数:参数i是表示帧序号.
def animate(i):
    sc.set_offsets(np.c_[x,y[i]])

anim = animation.FuncAnimation(fig, animate, 
                frames=len(y), interval=300, repeat=True) 


#保存的动画视频文件名为当前文件夹下的ani-052.mp4,帧率为20帧每秒,格式为MP4。
FFwriter = animation.FFMpegWriter(fps=20, extra_args=['-vcodec', 'libx264'])
anim.save('ani-052.mp4', writer = FFwriter)

plt.show()  # 会一直循环播放动画

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程