Я думаю, что это более функциональный способ сделать это. Ответы Дэна не работают в рекурсивном контексте.
Эта функция решает проблему, когда ваш элемент находится внутри других прокручиваемых 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)
);
};
Некоторые параметры, которые у вас есть для анимации графиков в 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()
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())
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())
Виджеты 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/ .
Вы можете найти этот урок интересным.
Если вы можете превратить то, что вам нужно, в анимацию 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