python - matplotlib 动画保存不遵守 blit=True 但它似乎在 plt.show() 中工作得很好

标签 python matplotlib animation save blit

我对 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 文件时,文本似乎没有位 block 传输。请帮忙。

谢谢

This is a screenshot of saved video file

最佳答案

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

关于python - matplotlib 动画保存不遵守 blit=True 但它似乎在 plt.show() 中工作得很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54386153/

相关文章:

python - 更改 PyScripter 以使用不同的 Python 版本

python - 如何在 Windows 上安装 matplotlib 2.0 beta?

python - seaborn热图y轴逆序

javascript - 如何使文本在页面加载时向右滑动?

python - 与 python 和 Kivy 斗争

python - GPU 下的 Tensorflow 比预期慢

python - 在底部绘制较大的点,在顶部绘制较小的点

javascript - 在 Javascript 中更新动画持续时间

c# - 无法解析 TargetName - Silverlight4 C#

python - FCM API 'Bad request 400' 错误