Reputation: 6819
Environment:
Code:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.animation import PillowWriter
fig = plt.figure()
def f(x, y):
return np.sin(x) + np.cos(y)
x = np.linspace(0, 2 * np.pi, 120)
y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1)
# ims is a list of lists, each row is a list of artists to draw in the
# current frame; here we are just animating one artist, the image, in
# each frame
ims = []
for i in range(20):
x += np.pi / 15.
y += np.pi / 20.
im = plt.imshow(f(x, y))
ims.append([im])
ani = animation.ArtistAnimation(fig, ims, interval=50, blit=True,
repeat_delay=500)
writer = PillowWriter(fps=20)
ani.save("demo2.gif", writer=writer)
plt.show()
Output: It only play once.
Upvotes: 13
Views: 15732
Reputation: 1151
I found a workaround answer here. You can do the following:
from matplotlib.animation import PillowWriter
class LoopingPillowWriter(PillowWriter):
def finish(self):
self._frames[0].save(
self._outfile, save_all=True, append_images=self._frames[1:],
duration=int(1000 / self.fps), loop=0)
ani = animation.ArtistAnimation(fig, ims, interval=50, blit=True,
repeat_delay=500)
ani.save('demo2.gif', writer=LoopingPillowWriter(fps=20))
Upvotes: 2
Reputation: 40707
Using imagemagick
as a writer produces a looping gif, but I can't tell you why that does not work with PillowWriter
ani.save("demo2.gif", writer='imagemagick')
Upvotes: 11