我是matplotlib的新手,我正在努力了解动画是如何运作的。
我编写了以下Python代码来移动矩形:
import matplotlib.pyplot as plt
import matplotlib.animation as animation
class AnimRect(object):
'''Animate a rectangle'''
def __init__(self):
self.fig = plt.figure(figsize = (5,5))
# create the axes
self.ax = plt.axes(xlim=(0,100), ylim=(0,100), aspect='equal')
# create rectangle
self.rect = plt.Rectangle((70,20), 10, 10,
fill=True, color='gold', ec='blue')
self.ax.add_patch(self.rect)
# initialization function
def init(self):
self.rect.set_xy((10.0, 10.0))
return self.rect,
# animation function
def animate(self, i):
self.rect.set_xy((i,i))
return self.rect,
def call_animation(self):
# call the animator function
animation.FuncAnimation(self.fig, self.animate, frames=91,
init_func= self.init,
interval=20, blit=True, repeat=False)
plt.show()
def main():
rect = AnimRect()
rect.call_animation()
main()
当我运行代码时,在初始位置(10.0,10.0)设置的矩形始终保持在屏幕上,而动画矩形的行为与预期一致。我无法理解为什么。我尝试了几个小的改动,但找不到解决方案。我做错了什么?
答案 0 :(得分:0)
初始化函数init_func
初始化每个帧,而不是整个动画;也就是说,它在每个帧的开头被调用。扔掉它看看会发生什么。
答案 1 :(得分:0)
您需要在init方法中将补丁的可见性设置为False,或者完全取消它。
使用init方法 - 在某些情况下它很有用:
请注意,我设置了blit=false
,因为它在mac os后端有一些奇怪的行为。
import matplotlib.pyplot as plt
import matplotlib.animation as animation
class AnimRect(object):
'''Animate a rectangle'''
def __init__(self):
self.fig = plt.figure(figsize = (5,5))
# create the axes
self.ax = plt.axes(xlim=(0,100), ylim=(0,100), aspect='equal')
# create rectangle
self.rect = plt.Rectangle((70,20), 10, 10,
fill=True, color='gold', ec='blue')
self.ax.add_patch(self.rect)
self.call_animation()
plt.show()
# initialization function
def init(self):
self.rect.set_xy((10.0, 10.0))
self.rect.set_visible(False)
return self.rect,
# animation function
def animate(self, i):
self.rect.set_xy((i,i))
self.rect.set_visible(True)
return self.rect,
def call_animation(self):
# call the animator function
self.anim = animation.FuncAnimation(self.fig, self.animate, frames=91,
init_func= self.init,
interval=20, blit=False, repeat=True)
def main():
rect = AnimRect()
main()
没有init:
import matplotlib.pyplot as plt
import matplotlib.animation as animation
class AnimRect(object):
'''Animate a rectangle'''
def __init__(self):
self.fig = plt.figure(figsize = (5,5))
# create the axes
self.ax = plt.axes(xlim=(0,100), ylim=(0,100), aspect='equal')
# create rectangle
self.rect = plt.Rectangle((70,20), 10, 10,
fill=True, color='gold', ec='blue')
self.ax.add_patch(self.rect)
self.call_animation()
plt.show()
# animation function
def animate(self, i):
self.rect.set_xy((i,i))
self.rect.set_visible(True)
return self.rect,
def call_animation(self):
# call the animator function
self.anim = animation.FuncAnimation(self.fig, self.animate, frames=91,
interval=20, blit=False, repeat=True)
def main():
rect = AnimRect()
main()