我想创建一个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
而不是让它驾驶我?如果是这样的话?
答案 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()