Mayavi通过Moviepy输出动画

1,准备

首先得安装Mayavi,看我之前的帖子,链接

然后安装Moviepy,pip install moviepy. 关于Moviepy怎么用,可以见官网

2,思路

通过Mayavi绘制每一帧的图片,然后Moviepy获取到每一帧,生成视频文件。

3,示例

 1 import numpy as np
 2 import mayavi.mlab as mlab
 3 import  moviepy.editor as mpy
 4 
 5 duration= 2 # duration of the animation in seconds (it will loop)
 6 
 7 # 使用MAYAVI先创建一个图片
 8 fig_myv = mlab.figure(size=(220,220), bgcolor=(1,1,1))
 9 X, Y = np.linspace(-2,2,200), np.linspace(-2,2,200)
10 XX, YY = np.meshgrid(X,Y)
11 ZZ = lambda d: np.sinc(XX**2+YY**2)+np.sin(XX+d)
12 
13 # 使用MoviePy把这个图片创建为一个动画,并保存
14 def make_frame(t):
15     mlab.clf() # clear the figure (to reset the colors)
16     mlab.mesh(YY,XX,ZZ(2*np.pi*t/duration), figure=fig_myv)
17     #下面两句很重要
18     f = mlab.gcf()
19     f.scene._lift()
20     return mlab.screenshot() #antialiased=True
21 
22 animation = mpy.VideoClip(make_frame, duration=duration)
23 animation.write_gif("sinc.gif", fps=20)

值得注意的是,很多地方提供了类似于上面的代码,但是运行时会报错:“ValueError: cannot reshape array of size 12 into shape (0,0,3)”

解决办法是在 返回screenshot()前添加两行代码

1 f = mlab.gcf()
2 f.scene._lift()

运行结果如下

 4,示例二

将我之前博客中的例子转换成动画

 1 import mayavi.mlab as mlab
 2 import numpy as np
 3 from moviepy.editor import VideoClip
 4 
 5 fig=mlab.figure(size=(200,200),bgcolor=(1.0,1.0,1.0))
 6 duration = 5
 7 #生成20个点坐标
 8 t = np.linspace(0, 4 * np.pi, 20)
 9 x = np.sin(2 * t)
10 y = np.cos(t)
11 z = np.cos(2 * t)
12 s = 2 + np.sin(t)
13 
14 def make_frame(t):
15     mlab.clf()
16     # # s数组只移动一位,点的颜色也就会变换
17     b = s[19]
18     s[1:20]=s[0:19]
19     s[0] = b
20     f = mlab.gcf()
21     f.scene._lift()
22     mlab.points3d(x, y, z, s, mode="cube",scale_mode="none", colormap="spectral", scale_factor=.5)
23     mlab.view(azimuth= 180*t/duration, distance=9) # camera angle
24     return mlab.screenshot(antialiased=True)
25 
26 # duration是gif时长
27 animation = VideoClip(make_frame, duration=duration)
28 # fps帧率
29 animation.write_gif('rot.gif', fps=3)

本来小球的颜色是由s变量控制的,每一帧将s数组中的数平移一位,这样颜色点的颜色就能变化了。每一秒3帧,mlab.view控制相机变换。

运行结果如下

 PS: Matplotlib输出动画

与Mayavi输出动画思路是一模一样的,区别在于返回每一帧图像的函数不同。

 1 import matplotlib.pyplot as plt
 2 import numpy as np
 3 from moviepy.editor import VideoClip
 4 from moviepy.video.io.bindings import mplfig_to_npimage
 5  
 6 x = np.linspace(-2, 2, 200)
 7  
 8 duration = 2
 9  
10 fig,ax = plt.subplots()
11 def make_frame(t):
12     ax.clear()
13     ax.plot(x, np.sin(x**2) + np.sin(x + 2*np.pi/duration * t), lw=3)
14     ax.set_ylim(-1.5, 2.5)
15     return mplfig_to_npimage(fig)
16  
17 animation = VideoClip(make_frame, duration=duration)
18 animation.write_gif("matplotlib.gif", fps=4)

运行结果:

 

原文地址:https://www.cnblogs.com/dalanjing/p/12293627.html