matplotlib сохранить анимацию в gif ошибка

Я хочу сохранить анимацию matplotlib в формате gif.

мне удалось сохранить анимацию в формате mp4, используя код

import matplotlib
matplotlib.use("Agg")

~some codes~

ani = animation.FuncAnimation(fig, draw, update, interval=10, blit=False)
mywriter = animation.FFMpegWriter(fps=60)
ani.save('myanimation.mp4',writer=mywriter)

но если я изменю myanimation.mp4 в формате gif, python делает ошибку

Traceback (most recent call last):
  File "C:UsersAdministratorDesktopedisonEdison_v4_backup_1ver5.py", line 164, in <module>
    ani.save('demoanimation.gif',writer=mywriter);
  File "C:Python27libsite-packagesmatplotlibanimation.py", line 718, in save
    writer.grab_frame(**savefig_kwargs)
  File "C:Python27libsite-packagesmatplotlibanimation.py", line 204, in grab_frame
    dpi=self.dpi, **savefig_kwargs)
  File "C:Python27libsite-packagesmatplotlibfigure.py", line 1421, in savefig
    self.canvas.print_figure(*args, **kwargs)
  File "C:Python27libsite-packagesmatplotlibbackend_bases.py", line 2220, in print_figure
    **kwargs)
  File "C:Python27libsite-packagesmatplotlibbackendsbackend_agg.py", line 497, in print_raw
    renderer._renderer.write_rgba(filename_or_obj)
RuntimeError: Error writing to file

видя, что мне удалось сохранить в формате mp4, я не знаю, почему он делает ошибку при сохранении формата gif.

4 ответов


Это так matplotlib не поддерживает gif без внешних программ. Если у вас есть imagemagick правильно установлен и настроен, это должно работать:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np


def init_animation():
    global line
    line, = ax.plot(x, np.zeros_like(x))
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1,1)

def animate(i):
    line.set_ydata(np.sin(2*np.pi*i / 50)*np.sin(x))
    return line,

fig = plt.figure()
ax = fig.add_subplot(111)
x = np.linspace(0, 2*np.pi, 200)

ani = matplotlib.animation.FuncAnimation(fig, animate, init_func=init_animation, frames=50)
ani.save('/tmp/animation.gif', writer='imagemagick', fps=30)

enter image description here


просто напоминание, прежде чем использовать библиотек matplotlib и ImageMagick для преобразования изображений или видео в gif,вам нужно изменить конфигурацию Matplotlib и добавить путь ImageMagick.

следующий код покажет вам путь к файлу конфигурации Matplotlib

import matplotlib
matplotlib.matplotlib_fname()

для меня путь

C:\Anaconda\lib\site-packages\matplotlib\mpl-data\matplotlibrc
изменение animation.convert_path
#animation.convert_path: 'convert' # Path to ImageMagick's convert binary.
                                   # On Windows use the full path since convert
                                   # is also the name of a system tool.

добавлять преобразовать.exe путь к это

animation.convert_path: C:\Program Files\ImageMagick-6.9.2-Q16-HDRI\convert.exe

не забудьте удалить # до animation.convert_path.

после вышеуказанной модификации Matplotlib и ImageMagick отлично будут работать и выводить вы хотите.

example gif

надеюсь, что это помогает.


сценарий DrV не работал для меня в Windows 7, хотя convert и ffmpeg оба находятся в системном пути.

  File "C:\Python27\lib\site-packages\matplotlib\backends\backend_agg.py", line 513, in print_raw
    renderer._renderer.write_rgba(filename_or_obj)

RuntimeError: Error writing to file

C:\Users>ffmpeg
ffmpeg version N-50911-g9efcfbe Copyright (c) 2000-2013 the FFmpeg developers
   ...

C:\Users>convert
Version: ImageMagick 6.9.1-1 Q16 x64 2015-03-20 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
   ...

редактировать мои matplotlibrc to добавить полный путь к exe исправлено это:

###ANIMATION settings
#animation.html : 'none'           # How to display the animation as HTML in
                                   # the IPython notebook. 'html5' uses
                                   # HTML5 video tag.
#animation.writer : ffmpeg         # 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.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.mencoder_path: 'mencoder'
                                   # Path to mencoder binary. Without full path
                                   # $PATH is searched
#animation.mencoder_args: ''       # Additional arguments to pass to mencoder
animation.convert_path: C:\Program Files\ImageMagick-6.9.1-Q16\convert.exe # Path to ImageMagick's convert binary.
                                   # On Windows use the full path since convert
                                   # is also the name of a system tool.

animated GIF output


все еще были некоторые проблемы на Mac OS X, но ответы выше указали мне в правильном направлении.

то, что я сделал, дошло до:

  1. заварить установить imagemagick
  2. отредактируйте файл пути в location /etc / path (sudo vim path) и добавьте расположение папки bin imagemagick, в моем случае: / usr / local/Cellar/imagemagick/6.9.6-4/бин
  3. изменены настройки matplotlibrc, как описано выше. Вы можете найти местоположение matplotlibrc, делая в Python:import matplotlib matplotlib.matplotlib_fname() Настройки, которые необходимо настроить, можно найти в конце файла. Я скорректировал следующие (прокомментировал). Обратите внимание, что эти настройки не находятся в кавычках:

    анимация.писатель : пакета ImageMagick

    анимация.кодек: mpeg4

    анимация.битрейт: -1

    анимация.frame_format: png

    анимация.convert_path: convert