pyplot矩形动画显示初始矩形

时间:2016-04-06 10:31:32

标签: python animation matplotlib rectangles

我是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)设置的矩形始终保持在屏幕上,而动画矩形的行为与预期一致。我无法理解为什么。我尝试了几个小的改动,但找不到解决方案。我做错了什么?

2 个答案:

答案 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()