2015-12-11 3 views
1

Я пытаюсь использовать следующий код для создания анимации:Почему UnicodeDecodeError при сохранении анимации matplotlib?

import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib.animation import ArtistAnimation 

fig = plt.figure() 
ax = fig.add_subplot(111) 

ax.set_xlim(0, 1) 
ax.set_ylim(-2,2) 

dt = 0.01 
q = 0.01 
t = np.arange(0,1,dt) 
x = np.sin(2*np.pi*t) 
images = [] 

for i in xrange(100): 
    x = (1-q) * x + q* np.random.normal(size = len(t)) 
    line, = ax.plot(t,x, '-') 
    images.append((line,)) 

line_anim = ArtistAnimation(fig, images, interval=50, blit=True) 

#line_anim.save('my_animation.mp4') 
#line_anim.save('my_animation.gif') 

plt.show() 

Он работает отлично. Я вижу анимацию, которую я ожидаю увидеть. Однако, если я пытаюсь сохранить его в `` gif` файл mp4 or (раскомментировать соответствующую строку кода), я получаю следующее сообщение об ошибке:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x84 in position 5: ordinal 
not in range(128) 

Кто-нибудь знает, что там происходит и как проблема может быть решена?

ответ

0

В документации указано, что если вы не укажете выделенный писатель в Animation.save, он использует значение rcParam для animation.writer. Я предполагаю, что ваша установка matplotlib не указывает правильное значение для этого параметра, следовательно, ошибка.

Вы должны указать писатель в save методе (и в любом случае контролировать установку Matplotlib):

line_anim.save('my_animation.mp4', writer = 'ffmpeg') 
+0

К сожалению, это не поможет. Я все равно получаю ту же ошибку: 'UnicodeDecodeError: 'ascii' кодек не может декодировать байт 0x84 в позиции 5' – Roman

0

я наткнулся на такую ​​же проблему при попытке запустить

ani = matplotlib.animation.FuncAnimation(...) 
ani.save("out.gif", writer="imagemagick", dpi=80,fps=10) 

на машине окна с помощью matplotlib 1.5.

Проблема в том, что matplotlib хочет назвать двоичный код изображения imagemagick convert. Однако в окнах есть еще один стандартный инструмент convert, который вызывается вместо этого, и выход которого вызывает эту ошибку в Юникоде. Чтобы этого не произошло, полный путь к преобразованию imagemagick должен быть доступен для matplotlib через "animation.convert_path" rcparam.

import matplotlib.pyplot as plt 
plt.rcParams["animation.convert_path"] = r"D:\Programs\ImageMagick\convert.exe" 
              #or whatever the full path is. 
Смежные вопросы