Базовая карта Python matplotlib - не может перерисовать разброс [дублировать]

Я думаю, что это более функциональный способ сделать это. Ответы Дэна не работают в рекурсивном контексте.

Эта функция решает проблему, когда ваш элемент находится внутри других прокручиваемых divs, проверяя любые уровни, рекурсивно верхние к тегу HTML, и останавливается в первом false.

/**
 * fullVisible=true only returns true if the all object rect is visible
 */
function isReallyVisible(el, fullVisible) {
    if ( el.tagName == "HTML" )
            return true;
    var parentRect=el.parentNode.getBoundingClientRect();
    var rect = arguments[2] || el.getBoundingClientRect();
    return (
            ( fullVisible ? rect.top    >= parentRect.top    : rect.bottom > parentRect.top ) &&
            ( fullVisible ? rect.left   >= parentRect.left   : rect.right  > parentRect.left ) &&
            ( fullVisible ? rect.bottom <= parentRect.bottom : rect.top    < parentRect.bottom ) &&
            ( fullVisible ? rect.right  <= parentRect.right  : rect.left   < parentRect.right ) &&
            isReallyVisible(el.parentNode, fullVisible, rect)
    );
};
12
задан Thomas K 23 May 2016 в 10:30
поделиться

4 ответа

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

  • Использование display в цикле Используйте IPython.display.display(fig) для отображения фигуры на выходе. Используя цикл, вы хотите очистить вывод до отображения новой фигуры. Обратите внимание, что эта методика дает в целом не столь гладкие результы. Поэтому я бы посоветовал использовать любое из приведенных ниже.
    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 %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())
16
ответ дан ImportanceOfBeingErnest 25 August 2018 в 07:29
поделиться

Виджеты 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. Я нашел несколько приятных анимированных gifs из http://www.downgraf.com/inspiration/25-beautiful-loading-bar-design-examples-gif-animated/ .

2
ответ дан DougR 25 August 2018 в 07:29
поделиться

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

Если вы можете превратить то, что вам нужно, в анимацию 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

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

11
ответ дан Perfi 25 August 2018 в 07:29
поделиться

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

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

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

2
ответ дан Will Holmes 25 August 2018 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: