2012-07-23 1 views
18

Gibt es eine Möglichkeit, animierte Grafiken zu erstellen. Zum Beispiel das gleiche Diagramm mit verschiedenen Parametern.Animierte Grafiken in Ipython-Notizbuch

Zum Beispiel SAGT Notebook ist, kann man schreiben:

a = animate([circle((i,i), 1-1/(i+1), hue=i/10) for i in srange(0,2,0.2)], 
      xmin=0,ymin=0,xmax=2,ymax=2,figsize=[2,2]) 
a.show() 

Antwort

7

Update: Januar 2014

Jake Vanderplas erstellt ein Javascript-basiertes Paket für matplotlib Animationen zur Verfügung here. Die Benutzung ist so einfach wie:

# https://github.com/jakevdp/JSAnimation 
from JSAnimation import examples 
examples.basic_animation() 

Example of Jake's JSAnimation package

his blog post Sehen Sie für eine vollständigere Beschreibung und Beispiele. Historische Antwort

Ja, das Javascript-Update hält nicht richtig den Bildrahmen noch (Goger für eine Korrektur sehen), so gibt es flimmern, aber man kann diese Technik etwas ganz einfach tun mit:

import time, sys 
from IPython.display import clear_output 
f, ax = plt.subplots() 

for i in range(10): 
    y = i/10*sin(x) 
    ax.plot(x,y) 
    time.sleep(0.5) 
    clear_output() 
    display(f) 
    ax.cla() # turn this off if you'd like to "build up" plots 
plt.close() 
+0

Könnten Sie vielleicht auch einen vernünftigen x-Wert hinzufügen? Ich habe Ihr Beispiel mit einem einfachen Bereich (100) und numpy.arange (0, 2 * pi, 0.01) versucht, aber keiner von beiden erzeugt eine nette Ausgabe. Es scheint auch, dass Sie einige Importe fehlen, um diesen Code auszuführen, wie es ist –

+0

Diese Bemerkung ist ein paar Jahre später: ** um das Flackern zu vermeiden ** set 'clear_output (True)' (IPython 2.0.0) –

+0

Danke @eldad! Ich sollte dies noch einmal aktualisieren :) –

9

Das hat schreckliches Flackern, aber zumindest schafft dies eine Handlung, die für mich animiert. Es basiert auf Arons, aber Arons funktioniert nicht wie es ist.

import time, sys 
from IPython.core.display import clear_output 
f, ax = plt.subplots() 

n = 30 
x = array([i/10.0 for i in range(n)]) 
y = array([sin(i) for i in x]) 
for i in range(5,n): 
    ax.plot(x[:i],y[:i]) 
    time.sleep(0.1) 
    clear_output() 
    display(f) 
    ax.cla() # turn this off if you'd like to "build up" plots 
plt.close() 
5

Wenn Sie IPython-Notebook verwenden, unterstützt v2.0 und höher interactive widgets. Sie können ein gutes Beispiel Notebook finden here (n.b. müssen Sie herunterladen und von Ihrem eigenen Computer laufen, um die Schieberegler zu sehen).

Es läuft im Wesentlichen auf den Import interact, und dann übergibt es eine Funktion, zusammen mit Bereichen für die Parameter. beispielsweise von dem zweiten Link:

In [8]: 
def pltsin(f, a): 
    plot(x,a*sin(2*pi*x*f)) 
    ylim(-10,10) 
In [9]: 
interact(pltsin, f=(1,10,0.1), a=(1,10,1)); 

Dies wird ein Stück mit zwei Schiebern, für f und a erzeugen.

+0

Ich versuche eine andere Art von Dingen in einem iPython-Notebook zu animieren und das sieht nach der besten Lösung aus, die ich bisher gefunden habe. Gibt es eine Möglichkeit, es automatisch animieren zu lassen, so dass der Benutzer die Schieberegler nicht manipulieren muss? – Addem

+0

Ich denke nicht, dass es trivial ist, dies zu tun. Aber werfen Sie einen Blick auf die Seite 'Ereignisse': Es gibt ein Beispiel für die programmgesteuerte Steuerung von Widgets unter Verwendung von Callbacks. In der Theorie könnte man also eine Schaltfläche haben, die beim Klicken nur eine 'for'-Schleife ausführt, die den Schieberegler/die Steuerung anpasst und dazwischen schläft. Das hätte den Effekt, dass jemand das Steuerelement manuell "verschiebt". Aber es ist nicht ideal. – Luciano

5

IPython widgets können Sie Python-Objekte im Kernel mit GUI-Objekten im Notebook bearbeiten. Sie könnten auch mögen Sage hosted IPython Notebooks. Ein Problem, das Sie möglicherweise beim Teilen von Widgets oder der Interaktivität in Notebooks haben, besteht darin, dass Ihre Arbeit nicht ausgeführt werden kann, wenn eine andere Person IPython nicht besitzt. Um das zu lösen, können Sie Domino zu share Notebooks mit Widgets verwenden, die andere ausführen können.

Im Folgenden finden Sie drei Beispiele für Widgets, die Sie in einem Notebook mit Pandas erstellen können, um Daten, Fraktale und einen Schieberegler für ein 3D-Diagramm zu filtern. Erfahren Sie mehr und sehen Sie den Code und Notebooks here.




enter image description here




enter image description here




enter image description here




Wenn Sie Daten-Live-Stream oder eine Simulation laufen als Schleife einrichten, können Sie auch stream data in Parzellen in einem Notebook . Haftungsausschluss: Ich arbeite für Plotly.

0

Auf @Gogers Kommentar zu 'horrious flickering' fand ich, dass das Aufrufen von clear_output (wait = True) mein Problem löste. Das Flag weist clear_output an, auf das Rendern zu warten, bis es etwas neues zu rendern gibt.

0

matplotlib hat ein animation Modul genau das zu tun. Die auf der Website bereitgestellten Beispiele werden jedoch nicht wie in einem Notebook ausgeführt. Sie müssen ein paar Verbesserungen vornehmen, damit es funktioniert.

Hier ist das Beispiel der Seite unten geändert, um in einem Notebook zu arbeiten (Änderungen in fett).


import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.animation import FuncAnimation 
from matplotlib import rc from IPython.display import HTML 

fig, ax = plt.subplots() 
xdata, ydata = [], [] 
ln, = plt.plot([], [], 'ro', animated=True) 

def init(): 
    ax.set_xlim(0, 2*np.pi) 
    ax.set_ylim(-1, 1) 
    return ln, 

def update(frame): 
    xdata.append(frame) 
    ydata.append(np.sin(frame)) 
    ln.set_data(xdata, ydata) 
    return ln, 

ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128), init_func=init, blit=True) rc('animation', html='html5') ani # plt.show() # not needed anymore 

Beachten Sie, dass die Animation in das Notebook über einen Film gemacht ist und Sie müssen ffmpeg installiert sein und konfiguriert matplotlib es zu benutzen.