Matplotlib не может сохранить анимацию - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть анимация matplotlib, и она не будет сохранять. Если я не сохраню его, он будет работать нормально и без ошибок. Когда я пытаюсь сохранить ошибки с сообщением, которое не помогает. Я погуглил эту ошибку и проверил все, но я не могу найти ответ на эту проблему. Я установил ffmpeg. Я делаю что-то не так, что очевидно? Я работаю на Ubuntu 19.10 с matplotlib 3.2.1, если это имеет значение.

Код для сохранения анимации приведен ниже:

    def run_animation(self, total_rounds):
        anim = animation.FuncAnimation(self.fig, self.animate,
                                       init_func=self.init,
                                       frames=total_rounds * 100,
                                       interval=40,
                                       blit=True)
#        Writer = animation.writers['ffmpeg']
#        writer = Writer(fps=15, metadata=dict(artist='Me'), bitrate=1800)
        anim.save('animation.mp4')

Отслеживание ошибок:

2020-04-01 02:20:58,279-INFO: MovieWriter._run: running command: ffmpeg -f rawvideo -vcodec rawvideo -s 1200x500 -pix_fmt rgba -r 25.0 -loglevel error -i pipe: -vcodec h264 -pix_fmt yuv420p -y animation.mp4
Traceback (most recent call last):
  File "/home/anon/.local/lib/python3.7/site-packages/matplotlib/backend_bases.py", line 2785, in _wait_cursor_for_draw_cm
    self.set_cursor(cursors.WAIT)
  File "/home/anon/.local/lib/python3.7/site-packages/matplotlib/backends/backend_gtk3.py", line 468, in set_cursor
    self.canvas.get_property("window").set_cursor(cursord[cursor])
AttributeError: 'NoneType' object has no attribute 'set_cursor'

Спасибо миллион за вашу помощь

1 Ответ

1 голос
/ 01 апреля 2020

Я понял это, как ни странно, мне нужно было сделать это перед всеми моими операциями импорта.

import matplotlib
matplotlib.use("Agg")

Если бы у меня не было этого, это не сработало бы. Кроме того, ffmpeg начал занимать некоторое время, поэтому я изменил функцию сохранения так:

anim.save('animation.mp4', progress_callback=lambda i, n: print(f'Saving frame {i} of {n}'))

Вид приятной скрытой функции в документах. Надеюсь, что ни у кого больше нет этой проблемы!

...