Анимация в ноутбуке iPython

Я пытаюсь поместить анимации в ноутбук iPython и не нахожу решения. Я видел один пост, который обсуждался с использованием интерактивных виджетов, но есть пара проблем, которые у меня есть: во-первых, каждый пример, который я вижу с виджетами, использует слайдер или какой-то другой ввод, тогда как я просто хочу, чтобы анимация запускалась автоматически при запуске ячейки. Во-вторых, вся документация кажется устаревшей на сайте Jupyter-всякий раз, когда я загружаю и запускаю свои ноутбуки, я получаю эти сообщения о том, что некоторые модули устарели, а затем в файле что-то не запускается, предположительно потому, что они пытаются импортировать и получить доступ к файлам, которые больше не существуют.

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

короче говоря, есть ли способ, которым я могу создавать анимации в ноутбуке iPython, которые требуют только использования простых команд импорта, которые будут работать из коробки, так сказать, с программным обеспечением, которое поставляется из Anaconda?

[Edit: я также должен отметить, что я использовал Tkinter для создания анимации, и я могу сделать это в matplotlib, я уверен. Поэтому, если бы был способ получить анимации, которые вы производите с теми, чтобы рендеринг в ноутбуке iPython, это, безусловно, было бы рабочим решением для меня.]

[дальнейшее редактирование: я полагаю, что могу также сказать, что я надеюсь оживить в данный момент, хотя я действительно хочу быть довольно гибким в отношении диапазона вещей, которые я мог бы оживить, если решу. Прямо сейчас я пытаюсь сделать цифровые часы, которые отображают каждую цифру в шумерской базе-60 цифр, чтобы проиллюстрировать другую систему счета и базы. Поэтому он должен сначала отображаться | затем через секунду || и так далее до тех пор, пока десять не будет представлено как

4 ответов


некоторые опции для анимации сюжетов в Jupyter / IPython, используя matplotlib:

  • используя display в цикле использовать IPython.display.display(fig) для отображения фигуры на выходе. Используя цикл, вы хотите очистить вывод перед отображением новой фигуры. Обратите внимание, что этот метод дает в целом не так гладко resluts. Поэтому я бы посоветовал использовать любое из приведенных ниже.

    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    from IPython.display import display, clear_output
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    for i in range(len(x)):
        animate(i)
        clear_output(wait=True)
        display(fig)
        
    plt.show()
  • %matplotlib notebook использовать Оболочкой IPython магии %matplotlib notebook чтобы установить бэкэнд на бэкэнд ноутбука. Это сохранит фигуру живой вместо отображения статического файла png и, следовательно, также может показывать анимацию.
    Пример:

    %matplotlib notebook
    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    
    plt.show()
  • %matplotlib tk использовать IPython magic %matplotlib tk для установки бэкэнда на бэкэнд tk. Это откроет фигуру в новом окне построения графика, которое является интерактивным и, таким образом, может также показывать анимацию.
    Полный пример:

    %matplotlib tk
    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    
    plt.show()
  • конвертировать анимацию в mp4 видео (опция уже упомянута @Perfi):

    from IPython.display import HTML
    HTML(ani.to_html5_video())
    

    или использовать plt.rcParams["animation.html"] = "html5" в начале ноутбука. Это потребует наличия видеокодеков ffmpeg для преобразования в видео HTML5. Затем видео отображается в строке. Поэтому это совместимо с %matplotlib inline бэкэнд. Полный пример:

    %matplotlib inline
    import matplotlib.pyplot as plt
    plt.rcParams["animation.html"] = "html5"
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    ani
    %matplotlib inline
    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    
    from IPython.display import HTML
    HTML(ani.to_html5_video())
  • конвертировать анимацию в JavaScript:

    from IPython.display import HTML
    HTML(ani.to_jshtml())
    

    или использовать plt.rcParams["animation.html"] = "jshtml" в начале ноутбука. Это отобразит анимацию как HTML с JavaScript. Это очень совместимо с большинством новых браузеров, а также с %matplotlib inline бэкэнд. Он доступен в matplotlib 2.1 или выше.
    Пример:

    %matplotlib inline
    import matplotlib.pyplot as plt
    plt.rcParams["animation.html"] = "jshtml"
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    ani
    %matplotlib inline
    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    
    from IPython.display import HTML
    HTML(ani.to_jshtml())

вы можете найти этот учебник интересным.

Если вы можете превратить то, что вам нужно, в анимацию matplotlib, и я уверен из вашего описания, что это возможно, вы можете использовать

from matplotlib import rc, animation
rc('animation', html='html5')

и отображать анимацию с помощью

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

может пригодиться!


У меня была похожая проблема, и этот вопрос помог мне начать. Я собрал блокнот, который иллюстрирует использование FuncAnimation вместе с хорошими объяснениями того, почему Блокнот делает некоторые вещи так, как он делает. Он также имеет ссылки на инструкции по FFmpeg. Он также имеет ссылки на примеры, которые я использовал при разработке и понимании анимации. Вы можете просмотреть мой вклад в: Анимация Иллюстрация

для вашего вопроса Вы можете найти интерактивный ползунки-лучший инструмент. Я также создал ноутбук, который демонстрирует интерактивные виджеты в Jupyter. Он доступен здесь; однако интерактивные части там не работают.

оба доступны в GitHub Repostory


виджеты Jupyter-хороший способ отображения анимации. Код ниже отображает анимированный gif.....

from ipywidgets import Image
from IPython import display
animatedGif = "animatedGifs/01-progress.gif" #path relative to your notebook
file = open(animatedGif , "rb")
image = file.read()
progress= Image(
    value=image,
    format='gif',
    width=100,
    height=100)
display.display(progress)

Вы можете закрыть эту анимацию через:

progress.close()

N. B. Я нашел несколько хороших анимированных GIF от http://www.downgraf.com/inspiration/25-beautiful-loading-bar-design-examples-gif-animated/.