2016-04-06 4 views
0

Я новичок в matplotlib, и я пытаюсь понять, как работает анимация.pyplot прямоугольник анимация оставляет исходный прямоугольник отображается

Я написал следующий код 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

Вам необходимо установить видимость патча 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() 

Без инициализации:

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() 
+0

Это решило проблему. Решение с помощью метода init работает со мной (Anaconda Python 3.4 для Windows) с blit либо True, либо False. Второе решение требует, чтобы blit был установлен в False. – JFC

+0

Хорошо, рад, что я мог бы помочь. Я думаю, что 'blit' должен быть установлен в False во втором случае, потому что' blit' должен сначала «удалить» измененные элементы; в отсутствие метода 'init' нет элемента для удаления, и он выдает ошибку. –

0

Функция инициализации init_func инициализирует каждый кадр, а не анимацию в целом; то есть он вызывается в начале каждого кадра. Бросьте это и посмотрите, что произойдет.

+0

Это действительно источник моего замешательства. Я не помню, чтобы прочитать это важное замечание в документации или учебниках. – JFC

Смежные вопросы