I've tried multiple animation sample codes and cannot get any of them working. Here's a basic one I've tried from the Matplotlib documentation:
""" A simple example of an animated plot """ import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation fig, ax = plt.subplots() x = np.arange(0, 2*np.pi, 0.01) # x-array line, = ax.plot(x, np.sin(x)) def animate(i): line.set_ydata(np.sin(x+i/10.0)) # update the data return line, #Init only required for blitting to give a clean slate. def init(): line.set_ydata(np.ma.array(x, mask=True)) return line, ani = animation.FuncAnimation(fig, animate, np.arange(1, 200), init_func=init, interval=25, blit=True) plt.show()
When I execute the above in an IPython Notebook, I just see a blank plot generated. I've tried running this from multiple servers (including Wakari), on multiple machines, using multiple browsers (Chrome, FF, IE).
I can save the animation to an mp4 file just fine and it looks good when played.
Any help is appreciated!
To summarize the options you have:
Using display
in a loop Use IPython.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:
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())
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With