Reputation: 384
I am aiming to export an animation as a gif format. I can achieve this using an mp4 but am getting an error when converting to gif. I'm not sure if its the script that wrong or some backend settings.
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import animation
df1 = pd.DataFrame({
'Time' : [1,1,1,2,2,2,3,3,3],
'GroupA_X' : [3, 4, 5, 12, 15, 16, 21, 36, 47],
'GroupA_Y' : [2, 4, 5, 12, 15, 15, 22, 36, 45],
'GroupB_X' : [2, 5, 3, 12, 14, 12, 22, 33, 41],
'GroupB_Y' : [2, 4, 3, 13, 13, 14, 24, 32, 45],
})
fig, ax = plt.subplots()
ax.grid(False)
ax.set_xlim(0,50)
ax.set_ylim(0,50)
def groups():
Group_A = df1[['Time','GroupA_X','GroupA_Y']]
GA_X = np.array(Group_A.groupby(['Time'])['GroupA_X'].apply(list))
GA_Y = np.array(Group_A.groupby(['Time'])['GroupA_Y'].apply(list))
GA = ax.scatter(GA_X[0], GA_Y[0], c = ['blue'], marker = 'o', s = 10, edgecolor = 'black')
return GA, GA_X, GA_Y
def animate(i) :
GA, GA_X, GA_Y = groups()
GA.set_offsets(np.c_[GA_X[0+i], GA_Y[0+i]])
ani = animation.FuncAnimation(fig, animate, np.arange(0,3), interval = 1000, blit = False)
# If exporting as an mp4 it works fine.
#Writer = animation.writers['ffmpeg']
#writer = Writer(fps = 10, bitrate = 8000)
#ani.save('ani_test.mp4', writer = writer)
#But if I try to export as a gif it returns an error:
ani.save('gif_test.gif', writer = 'imagemagick')
Error:
MovieWriter imagemagick unavailable. Trying to use pillow instead.
self._frames[0].save(
IndexError: list index out of range
Note: I have also tried the following which returns the same Index error
my_writer=animation.PillowWriter(fps = 10)
ani.save(filename='gif_test.gif', writer=my_writer)
I have tried adjusting numerous settings from other questions animate gif. My current animation settings are as follows. I am using a Mac.
###ANIMATION settings
#animation.html : none ## How to display the animation as HTML in
## the IPython notebook. 'html5' uses
## HTML5 video tag; 'jshtml' creates a
## Javascript animation
#animation.writer : imagemagick ## MovieWriter 'backend' to use
#animation.codec : mpeg4 ## Codec to use for writing movie
#animation.bitrate: -1 ## Controls size/quality tradeoff for movie.
## -1 implies let utility auto-determine
#animation.frame_format: png ## Controls frame format used by temp files
#animation.html_args: ## Additional arguments to pass to html writer
animation.ffmpeg_path: C:\Program Files\ImageMagick-6.9.1-Q16\ffmpeg.exe ## Path to ffmpeg binary. Without full path
## $PATH is searched
#animation.ffmpeg_args: ## Additional arguments to pass to ffmpeg
#animation.avconv_path: avconv ## Path to avconv binary. Without full path
## $PATH is searched
#animation.avconv_args: ## Additional arguments to pass to avconv
animation.convert_path: C:\Program Files\ImageMagick-6.9.2-Q16-HDRI ## Path to ImageMagick's convert binary.
## On Windows use the full path since convert
## is also the name of a system tool.
#animation.convert_args: ## Additional arguments to pass to convert
#animation.embed_limit : 20.0
Upvotes: 1
Views: 4121
Reputation: 10338
The paths you have configured,
animation.ffmpeg_path: C:\Program Files\ImageMagick-6.9.1-Q16\ffmpeg.exe
and
animation.convert_path: C:\Program Files\ImageMagick-6.9.2-Q16-HDRI
Are for Windows, but since you are on Mac you need paths for MacOS. You should be able to get them using which
from the terminal. On my Ubuntu install which
gives the following
>$ which convert
/usr/bin/convert
>$ which ffmpeg
/usr/bin/ffmpeg
It should be similar for MacOS. Those are the paths which need to be supplied to the rcParams animation.convert_path
and animation.ffmpeg_path
, i.e.
animation.ffmpeg_path: /usr/bin/ffmpeg
animation.convert_path: /usr/bin/convert
Do note that while having the wrong paths in the matplotlib configuration would produce the error in question, fixing it may not resolve the error - there might be something else wrong as well.
Upvotes: 2
Reputation: 96
I found the solution from a post to of a similar question. It seems the PillowWriter class is what worked on my computer, I couldn't get over the error arising from the ImageMagick class. You may have a better idea on what to set the bitrate and codec to, these were guesses or copied from the question I mentioned before.
ani = animation.FuncAnimation(fig, new_animate, frames=np.arange(0, 3)
plt.show()
my_writer=animation.PillowWriter(fps=20, codec='libx264', bitrate=2)
ani.save(filename='gif_test.gif', writer=my_writer)
Upvotes: 1