Используя matplotlib's FuncAnimation
для создания анимации, я получаю сообщение об ошибке
Traceback (most recent call last):
File "/scratch/seismo_proxauf/.conda/envs/proxconda3/lib/python3.7/site-packages/matplotlib/cbook/__init__.py", line 216, in process
func(*args, **kwargs)
File "/scratch/seismo_proxauf/.conda/envs/proxconda3/lib/python3.7/site-packages/matplotlib/animation.py", line 957, in _start
self.event_source.add_callback(self._step)
AttributeError: 'NoneType' object has no attribute 'add_callback'
после успешного сохранения анимации. Сюжет также открывается после краткого закрытия. Ниже приведен минимальный пример. Ошибка может быть активирована / деактивирована путем установки флага error_trigger
на True
и False
соответственно. Кажется, это связано с внутренним рендерингом латекса. Строка формата %d
в строке заголовка оси имеет решающее значение, без какой-либо вставки строки код, кажется, всегда работает. Дополнительные команды после сохранения анимации используются из-за моего более раннего вопроса Stackoverflow .
Примечание. Эта ошибка возникает при интерактивном использовании PyCharm (отметьте код и нажмите Ctrl+Alt+E
), но не в терминал по умолчанию (python test_animation.py
).
Технические характеристики: Python 3.7.6, matplotlib 3.1.2, ffmpeg 4.2, PyCharm 2019.3.1 Community Edition
Что вызывает это сообщение об ошибке и как его можно избежать (даже с PyCharm)?
Обновление : при запуске код несколько раз с активированной ошибкой, последующие анимации закроются корректно и больше не будут отображать сообщение об ошибке. Однако окно сюжета первой анимации останется открытым.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
# plt.ion()
def animate(iter_temp, error_trigger_temp):
ax = plt.gca()
plt.imshow(np.random.rand(10,10))
if error_trigger_temp == True:
ax.set_title(r'$t_a$, timestep %d' % (iter_temp))
else:
ax.set_title('t_a, timestep %d' % (iter_temp))
error_trigger = True
iter = np.arange(10)
fig = plt.figure()
myani = FuncAnimation(fig, animate, frames=iter, fargs=(error_trigger,), interval=50)
myani.save('~/test_animation.mp4', writer='ffmpeg')
myani.event_source.stop()
del myani
plt.close()