2013-08-22 17 views
7

Il mio codice produce un numero di grafici dai dati usando matplotib e vorrei poter scorrere avanti e indietro attraverso di essi in una dimostrazione dal vivo (magari premendo i tasti avanti e indietro o usando il topo). Attualmente devo salvare ognuno di essi come un'immagine separatamente e quindi utilizzare un visualizzatore di immagini separato per scorrere attraverso di essi. C'è un modo per farlo interamente da Python?Scorrere avanti e indietro attraverso i grafici matplotlib

+0

Il tempo richiesto per generare i grafici è troppo lungo per poterlo fare? Cioè 'premi un pulsante -> genera un grafico -> mostra esso 'e così via. –

+0

@AleksanderLidtke Posso generarli dal vivo ma come faccio a scorrere avanti e indietro attraverso i grafici che ho creato? – phoenix

+0

richiamate. Vedi http://matplotlib.org/users/event_handling.html. Così com'è, questa domanda è troppo ampia. – tacaswell

risposta

9

Un modo semplice per raggiungere questo sta memorizzando in una lista una tupla dei xey array e quindi utilizzare un evento gestore che raccoglie la coppia successiva (x, y) da disegnare:

import numpy as np 
import matplotlib.pyplot as plt 

# define your x and y arrays to be plotted 
t = np.linspace(start=0, stop=2*np.pi, num=100) 
y1 = np.cos(t) 
y2 = np.sin(t) 
y3 = np.tan(t) 
plots = [(t,y1), (t,y2), (t,y3)] 

# now the real code :)  
curr_pos = 0 

def key_event(e): 
    global curr_pos 

    if e.key == "right": 
     curr_pos = curr_pos + 1 
    elif e.key == "left": 
     curr_pos = curr_pos - 1 
    else: 
     return 
    curr_pos = curr_pos % len(plots) 

    ax.cla() 
    ax.plot(plots[curr_pos][0], plots[curr_pos][1]) 
    fig.canvas.draw() 

fig = plt.figure() 
fig.canvas.mpl_connect('key_press_event', key_event) 
ax = fig.add_subplot(111) 
ax.plot(t,y1) 
plt.show() 

In questo codice scelgo le frecce right e left per iterare, ma puoi cambiarle.

+0

Grazie mille jabaldonedo --- il tuo esempio è ora nel mio progetto e quindi posso confermare per gli altri che funziona. Nel mio caso "key_event" è una chiusura all'interno di una chiusura all'interno di un decoratore. Non capisco la causa --- quindi aiutami non è la punteggiatura errata alla fine della riga precedente --- ma continuavo a ricevere "nome globale' curr_pos' non definito ", nonostante sia chiaramente definito da' curr_pos = 0'. Ho optato per una soluzione nella forma 'if not hasattr (key_event," curr_pos "): key_event.curr_pos = 0' al posto di' global curr_pos'. Vorrei usare 'key_event .__ dict __ = {}' per resettare se necessario. –

Problemi correlati