matplotlib动画保存不遵循blit = True,但在plt.show()中似乎还可以

时间:2019-01-27 07:55:51

标签: python matplotlib animation save blit

我是Python的新手,正在尝试使用matplotlib为文本设置动画。通过几个在线示例得出以下代码:

input = {2:3, 1:89, 4:5, 3:0}
original = create_memory_from_input(input)
action = 64
result = {2:54, 1:1, 4:34, 3:0}

original.loc[0, ('action', 'action')] = action
for num in range(1, 5):
    original.loc[0, ('result', num)] = result[num]

因此,当我在控制台中运行它时,我可以看到文本很好地移动。但是,当我将其保存到MP4文件中时,文本似乎不会变白。请帮忙。

谢谢

This is a screenshot of saved video file

1 个答案:

答案 0 :(得分:0)

您观察到的是预期的行为。划线是一种仅刷新部分图形输出的技术。在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()