Следующий скрипт создает простую анимацию бегущей синусоидальной волны при выполнении с помощью %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.
Возможно, Canopy использует разные настройки matplotlib, чем IDLE или PyLab (например, интерактивный режим). – BrenBarn
В качестве ответа, на который вы ссылаетесь, поведение вашего проблемного кода не определено, поскольку оно зависит от объекта, который был удален и доступен для сбора мусора. По умолчанию Canopy использует pylab с графическим интерфейсом Qt. Стандартный ярлык pylab и pylab из командной строки и IDLE используют старый Wx-сервер. Неудивительно, что разные графические бэкенды ведут себя по-разному, когда поведение не определено. Возможно, Qt, будучи более современным и совершенным, чем Wx, делает сборку мусора более энергично. –
BTW, если вы используете настройки Canopy (вкладка Python), чтобы изменить бэкэнд от Qt до Wx, вы обнаружите, что Canopy также отображает график, как и в других двух средах. Речь идет о бэкэнде, а не об окружающей среде. BTW2: Неправильный код, который, как представляется, приводит к желаемому результату, вряд ли «работает», а среда, в которой вы используете код, вряд ли «работает» или «не работает» в зависимости от того, какой результат вы ожидали. –