Animation in iPython notebook
You may find this tutorial interesting.
If you can turn what you need into a matplotlib animation, and I'm fairly sure from your description that it's possible, you can then use
from matplotlib import rc, animation
rc('animation', html='html5')
and display your animation using
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=N, interval=20, blit=True)
anim
Might come in handy!
Jupyter widgets is a good way of displaying animations. The code below displays an animated 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)
You can close this animation using:
progress.close()
N.B. I found a few nice animated gifs from http://www.downgraf.com/inspiration/25-beautiful-loading-bar-design-examples-gif-animated/.
Some options you have for animating plots in Jupyter/IPython, using matplotlib:
Using
display
in a loop UseIPython.display.display(fig)
to display a figure in the output. Using a loop you would want to clear the output before a new figure is shown. Note that this technique gives in general not so smooth resluts. I would hence advice to use any of the below.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
Use IPython magic%matplotlib notebook
to set the backend to the notebook backend. This will keep the figure alive instead of displaying a static png file and can hence also show animations.
Complete example:%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
Use IPython magic%matplotlib tk
to set the backend to the tk backend. This will open the figure in a new plotting window, which is interactive and can thus also show animations.
Complete example:%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()
Convert animation to mp4 video (option mentionned by @Perfi already):
from IPython.display import HTML HTML(ani.to_html5_video())
or use
plt.rcParams["animation.html"] = "html5"
at the beginning of the notebook. This will require to have ffmpeg video codecs available to convert to HTML5 video. The video is then shown inline. This is therefore compatible with%matplotlib inline
backend. Complete example:%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())
Convert animation to JavaScript:
from IPython.display import HTML HTML(ani.to_jshtml())
or use
plt.rcParams["animation.html"] = "jshtml"
at the beginning of the notebook. This will display the animation as HTML with JavaScript. This highly compatible with most new browsers and also with the%matplotlib inline
backend. It is available in matplotlib 2.1 or higher.
Complete example:%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())