Matplotlib动画;在推模式下动画,而不是使用回调功能

时间:2017-05-26 08:09:56

标签: python animation matplotlib

我想创建一个matplotlib动画,但不是让matplotlib给我打电话,而是想调用matplotlib。例如,我想这样做:

from random import random
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

def update(frame):
    plt.scatter(random(),random())

fig, ax = plt.subplots()
ani = FuncAnimation(fig, update, interval=340, repeat=True)
ani.save("my.mov", "avconv")

像这样:

def update():
    plt.scatter(random(),random())

fig, ax = plt.subplots()
ani = MadeUpSubClassPassiveAnimation(fig)

while True:
  update()
  ani.update()
  # do other stuff ...

ani.save("my.mov", "avconv") 

我意识到我可以开这样的现场情节:

def update():
  plt.scatter(x, y)
  plt.pause(0.01)

fig, ax = plt.subplots()
plt.ion()

while True:
  update()
  time.sleep(1)

但AFAIK我需要Animation使用save()功能。那么,是否有可能驾驶Animation而不是让它驾驶我?如果是这样的话?

1 个答案:

答案 0 :(得分:1)

保存时会运行Animation。这意味着动画需要在运行两次时可重复地给出相同的结果(一次用于保存,一次用于显示)。换句话说,动画需要根据连续帧来定义。根据此要求,可以使用函数(FuncAnimation)或帧列表(ArtistAnimation)上的回调构建任何动画。

问题的例子可以用ArtistAnimation完成(为了不分别为已保存和显示的动画设置不同的随机数):

import matplotlib.pyplot as plt
import matplotlib.animation
from random import random

def update(frame):
    sc = ax.scatter(random(),random())
    return [sc]

fig, ax = plt.subplots()

artists = []

for i in range(10):
    sc = update(i)
    artists.append(sc)

# If you want previous plots to be present in all frames, add
#artists = [[j[0] for j in artists[:i+1]] for i in range(len(artists))]

ani = matplotlib.animation.ArtistAnimation(fig,artists,interval=100)
ani.save(__file__+".gif", writer="imagemagick") 
plt.show()