matplotlib 动画保存不遵守 blit=True 但它似乎在 plt.show() 中工作得很好
matplotlib animation save is not obeying blit=True but it seems to work just fine in plt.show()
我是 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 文件时,文本似乎并没有 blit。请帮助。
谢谢
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()
对于 line2D
对象,您可以对移动点使用 set_data( )
方法:
line , = ax.plot( x[0], y[0] , "ro")
...
def animar(i):
line.set_data( x[i] , y[i], "ro" )
return line
在 matplotlib.animation
示例中有一个使用这种方法的小脚本。
我是 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 文件时,文本似乎并没有 blit。请帮助。
谢谢
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()
对于 line2D
对象,您可以对移动点使用 set_data( )
方法:
line , = ax.plot( x[0], y[0] , "ro")
...
def animar(i):
line.set_data( x[i] , y[i], "ro" )
return line
在 matplotlib.animation
示例中有一个使用这种方法的小脚本。