Сохранение анимации matplotlib не подчиняется blit = True, но, похоже, в plt.show () работает нормально. - PullRequest
0 голосов
/ 27 января 2019

Я новичок в Python и пытаюсь анимировать текст с помощью matplotlib. использовал несколько онлайн-примеров для получения следующего кода:

import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()

plt.xlabel('Distance')
plt.ylabel('Height')
plt.title('Object Trajectory \n')

plt.legend(loc="upper right", markerscale=4, fontsize=10)
plt.grid()

text=ax.text(3,1,'Moving Text', ha="left", va="bottom",clip_on=True,rotation=90,fontsize=15)    
text2=ax.text(0,1,'Moving Text', ha="left", va="bottom",clip_on=True,fontsize=15)    

def init():
    ax.set_xlim(0,10)
    ax.set_ylim(0,10)
    return text,text2

def update(frame):        
    #Moving a text
    text=ax.text(3,1+(int(frame))/30,'Moving Text', ha="left", va="bottom",clip_on=True,rotation=90,fontsize=15)    
    text2=ax.text(0+(int(frame))/30,1,'Moving Text', ha="left", va="bottom",clip_on=True,fontsize=15)    

    return text,text2

anim = animation.FuncAnimation(fig, update, init_func=init, frames=120, interval=10, blit=True)

anim.save('try_animation.mp4',dpi=160,fps=30, writer="ffmpeg")

plt.show()

Поэтому, когда я запускаю его в консоли, я вижу, что тексты движутся хорошо. Но когда я сохраняю его в файл MP4, кажется, что текст не мигает. Пожалуйста, помогите.

Спасибо

Это скриншот сохраненного видеофайла

1 Ответ

0 голосов
/ 27 января 2019

То, что вы наблюдаете, - это ожидаемое поведение.Блиттинг - это метод, используемый для обновления только части графического вывода.В случае matplotlib вместо рисования всего рисунка обновляется только его часть, а именно область внутри осей, и рисуются только те художники, которые возвращены функцией анимации.Это позволяет иметь более высокую скорость анимации на экране.

Однако, при сохранении анимации, каждый кадр должен быть нарисован в полноте.

Таким образом, чтобы текст двигался, лучше обновить одинположение текста, вместо того, чтобы создавать новые тексты снова и снова.Это можно сделать с помощью

text.set_position((x,y))

Пример будет выглядеть как

import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()

plt.xlabel('Distance')
plt.ylabel('Height')
plt.title('Object Trajectory \n')
plt.grid()

text=ax.text(3,1,'Moving Text', ha="left", va="bottom",clip_on=True,rotation=90,fontsize=15)    
text2=ax.text(0,1,'Moving Text', ha="left", va="bottom",clip_on=True,fontsize=15)    

def init():
    ax.set_xlim(0,10)
    ax.set_ylim(0,10)
    return text,text2

def update(frame):        
    #Moving a text
    text.set_position((3, 1+(int(frame))/30))
    text2.set_position((0+(int(frame))/30,1))
    return text,text2

anim = animation.FuncAnimation(fig, update, init_func=init, frames=120, interval=10, blit=True)

anim.save('try_animation.mp4',dpi=160,fps=30, writer="ffmpeg")

plt.show()
...