2014-08-27 2 views
1

Следующий скрипт создает простую анимацию бегущей синусоидальной волны при выполнении с помощью %run заявления в пологом 1.4.1:Использования matplotlib.animation внутри функции в пологом

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib import animation 

def animator(): 
    fig = plt.figure() 
    ax = plt.axes(xlim=(0, 2), ylim=(-2, 2)) 
    line, = ax.plot([], [], lw=2) 

    def init(): 
     line.set_data([], []) 
     return line, 

    def animate(i): 
     x = np.linspace(0, 2, 1000) 
     y = np.sin(2 * np.pi * (x - 0.01 * i)) 
     line.set_data(x, y) 
     return line, 

    anim = animation.FuncAnimation(fig, animate, init_func=init, 
           frames=200, interval=20, blit=True) 

    plt.show() 

animator() 

Однако, если удалить последние , запустите сценарий с %run и вызовите animator() из интерпретатора, только первый кадр рисуется на экране. Почему это? Как я могу получить вызов функции для создания анимации внутри Canopy?

Как ни странно, эта проблема не возникает ни в IDLE, ни в IPython (PyLab), где вызов animator() из интерпретатора отлично работает. Более того, проблема ограничивается интерактивным отображением: если я добавлю еще несколько строк в animator, чтобы сохранить анимацию в формате mp4, файл mp4 будет сохранен правильно даже с Canopy.

Вышеупомянутый код основан на учебнике от Jake Vanderplas.

ответ

1

Я выяснил ответ на вторую часть моего вопроса: как предлагалось in this answer, у меня должна быть функция return anim. Но я по-прежнему несколько смущен тем, что здесь и здесь по-разному ведут себя Канопи и другие переводчики. (Почему работают IDLE и PyLab?) Любое понимание было бы оценено!

+0

Возможно, Canopy использует разные настройки matplotlib, чем IDLE или PyLab (например, интерактивный режим). – BrenBarn

+1

В качестве ответа, на который вы ссылаетесь, поведение вашего проблемного кода не определено, поскольку оно зависит от объекта, который был удален и доступен для сбора мусора. По умолчанию Canopy использует pylab с графическим интерфейсом Qt. Стандартный ярлык pylab и pylab из командной строки и IDLE используют старый Wx-сервер. Неудивительно, что разные графические бэкенды ведут себя по-разному, когда поведение не определено. Возможно, Qt, будучи более современным и совершенным, чем Wx, делает сборку мусора более энергично. –

+1

BTW, если вы используете настройки Canopy (вкладка Python), чтобы изменить бэкэнд от Qt до Wx, вы обнаружите, что Canopy также отображает график, как и в других двух средах. Речь идет о бэкэнде, а не об окружающей среде. BTW2: Неправильный код, который, как представляется, приводит к желаемому результату, вряд ли «работает», а среда, в которой вы используете код, вряд ли «работает» или «не работает» в зависимости от того, какой результат вы ожидали. –

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