绘制动画效果-Celluloid

  • A+
摘要本文会介绍利用 Celluloid 来创建动图。该库可以较好的利用 matplotlib 原本的代码来绘制出动图。

简介

这一篇我们会使用 Celluloid 结合 matplotlib 来绘制动图。在默认情况下,我们可以使用 matplotlib 中的 animation 模块来绘制动态图像。但是 Celluloid 提供了一种更加简化的方式,可以让我们更好的重复使用 matplotlib 的代码。

为了使用 Celluloid,我们首先进行安装:

  1. pip install celluloid

 

参考资料

 

使用 Celluloid 的方式

我们可以依据下面的三个步骤来创建一个动图。

步骤一,首先创建一个 matplotlib 的 Figure,同时对这个 Figure 创建一个 Camera

  1. from celluloid import Camera
  2. fig = plt.figure()
  3. camera = Camera(fig)

步骤二,创建每一帧,并使用 camera 进行记录(snapshot)

  1. plt.plot(...)
  2. plt.fancy_stuff()
  3. camera.snap()

步骤三,在所有帧都被捕捉到之后,创建一个动图

  1. animation = camera.animate()
  2. animation.save('animation.mp4')

 

在 jupyter notebook 中显示

如果我们想要在 jupyter notebook 中进行显示,可以使用以下的方式:

  1. from IPython.display import HTML
  2. animation = camera.animate()
  3. HTML(animation.to_html5_video())

 

Celluloid 创建动画的例子

上面介绍了 Celluloid 的使用的三个步骤,下面介绍一些例子,来进一步熟悉 Celluloid 的用法。

创建一条变化的直线

下面是一个基础的例子,绘制一条平着的直线,直线往上运动。

  1. import matplotlib.pyplot as plt
  2. from celluloid import Camera
  3. fig = plt.figure()
  4. camera = Camera(fig)
  5. for i in range(10):
  6.     plt.plot([i] * 10)
  7.     camera.snap() # 将上面的 plot 记录下来, 相当于是 snapshot
  8. animation = camera.animate() # 制作动画
  9. animation.save('celluloid_minimal.gif', writer='imagemagick')

最终生成的动图如下所示:

绘制动画效果-Celluloid

 

控制动图的快慢与颜色

可以看到上面每一条线在绘制的时候,颜色都发生了改变,同时时间间隔也是会比较快。这两个我们都可以进行调节。

  • 颜色我们可以通过绘图的时候,指定 color 即可。
  • 关于绘制的速度,可以通过 interval 来进行指定,默认是 200,这里我们调整为 500,减慢速度。
  1. import matplotlib.pyplot as plt
  2. from celluloid import Camera
  3. fig = plt.figure()
  4. camera = Camera(fig)
  5. change_value = [1,2,3,4,5,6,6,6,6,6,5,4,3,2,1]
  6. for i in range(len(change_value)+1):
  7.     plt.plot(change_value[:i], color='blue')
  8.     camera.snap() # 将上面的 plot 记录下来, 相当于是 snapshot
  9. animation = camera.animate(interval=500) # 制作动画
  10. animation.save('celluloid_minimal.gif', writer='imagemagick')

最终的结果如下所示:

绘制动画效果-Celluloid

 

多个子图的绘制

同时 Celluloid 也支持有子图时的绘制,下面是官方的一个例子:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from celluloid import Camera
  4. fig, axes = plt.subplots(2)
  5. camera = Camera(fig)
  6. t = np.linspace(0, 2 * np.pi, 128, endpoint=False)
  7. for i in t:
  8.     axes[0].plot(t, np.sin(t + i), color='blue')
  9.     axes[1].plot(t, np.sin(t - i), color='blue')
  10.     camera.snap()
  11. animation = camera.animate()
  12. animation.save('celluloid_minimal.gif')
绘制动画效果-Celluloid
  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: