2012-07-23 18 views
18

Czy istnieje sposób na tworzenie animowanych wykresów. Na przykład pokazano ten sam wykres, z różnymi parametrami.Animowane wykresy w notatniku ipython

Na przykład jest SAGE notebook, można napisać:

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() 

Odpowiedz

7

Aktualizacja: styczeń 2014

Jake Vanderplas stworzył pakiet JavaScript opartego na animacji matplotlib dostępnych here. Korzystanie z niego jest bardzo proste:

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

Example of Jake's JSAnimation package

Zobacz his blog post dla pełniejszego opisu i przykładów. odpowiedź historyczna (patrz Goger do korekty)

Tak, aktualizacja Javascript nie prawidłowo trzymać jeszcze ramkę obrazu, więc nie ma migotania, ale można zrobić coś całkiem proste przy użyciu tej techniki:

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

Czy mógłbyś też dodać sensowną wartość x? Próbowałem twojego przykładu z prostym zakresem (100) i numpy.arange (0, 2 * pi, 0.01), ale żadna nie tworzy ładnego wyjścia. Wydaje się również, że brakuje niektórych importów do uruchomienia tego kodu, tak jak jest –

+0

Ta uwaga jest trochę lat później: ** aby uniknąć migotania ** ustaw 'clear_output (True)' (IPython 2.0.0) –

+0

Dzięki @eldad! Powinienem to jeszcze raz zaktualizować :) –

9

To ma okropne migotanie, ale przynajmniej to tworzy fabułę, która ożywia mnie. Opiera się na Aronie, ale Aron nie działa tak jak jest.

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

Jeśli korzystasz z laptopa IPython, wersja 2.0 lub nowsza to interactive widgets. Możesz znaleźć dobry przykład notebooka here (n.b. musisz pobrać i uruchomić z własnego komputera, aby zobaczyć suwaki).

Zasadniczo sprowadza się do importowania interact, a następnie przekazuje mu funkcję wraz z zakresami dla parametrów. na przykład, od drugiego członu:

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)); 

to wytworzy się wykres z dwoma suwakami, do f i a.

+0

Próbuję animować różne rzeczy w notatniku iPythona, a to wygląda na najlepsze rozwiązanie, które znalazłem do tej pory. Czy istnieje sposób, aby uczynić go animowanym automatycznie, aby użytkownik nie musiał manipulować suwakami? – Addem

+0

Nie wydaje mi się to banalne. Ale spójrz na stronę "events": istnieje przykład programowego kontrolowania widgetów za pomocą callbacków. Więc teoretycznie możesz mieć przycisk, który po kliknięciu uruchamia pętlę 'for', która reguluje suwak/kontrolkę, i śpi pomiędzy. To by spowodowało, że ktoś "przesuwał" sterowanie ręcznie. Ale nie jest idealny. – Luciano

5

IPython widgets pozwala ci manipulować obiektami Pythona w jądrze za pomocą obiektów GUI w Notatniku. Być może spodoba Ci się Sage hosted IPython Notebooks. Jednym z problemów związanych z udostępnianiem widgetów lub interaktywnością w notebookach jest to, że jeśli ktoś nie ma IPythona, nie może uruchomić swojej pracy. Aby rozwiązać ten problem, możesz użyć Domino do share Notebooks z widżetami, które mogą być uruchamiane przez innych.

Poniżej znajdują się trzy przykłady widżetów, które można zbudować w notebooku, używając pand do filtrowania danych, fraktali i suwaka dla wykresu 3D. Dowiedz się więcej i zobacz kod i notebooki here.




enter image description here




enter image description here




enter image description here




Jeśli chcesz żyć, strumień danych lub utwórz symulację, aby uruchomić jako pętla, można również stream data na działkach w notatniku . Zastrzeżenie: Pracuję dla firmy Plotly.

0

W komentarzu @ gogera o "okropnym migotaniu" odkryłem, że wywołanie problemu clear_output (wait = True) rozwiązało mój problem. Flaga mówi clear_output, aby czekać, aż wyrenderuje, że ma coś nowego do renderowania.

0

matplotlib ma moduł animation do zrobienia właśnie tego. Jednak przykłady podane na stronie nie będą działać tak jak w notatniku; musisz zrobić kilka poprawek, aby to działało.

Oto przykład poniższej strony zmodyfikowanej do pracy w notatniku (zmiana w pogrubiona).


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 

Należy pamiętać, że animacja w notebooku jest wykonany za pomocą filmu i że trzeba mieć zainstalowany ffmpeg i matplotlib skonfigurowany tak, aby go używać.