2013-08-22 18 views
7

Mein Code erzeugt eine Anzahl von Plots aus Daten mit Matplotib und ich möchte in einer Live - Demonstration vorwärts und rückwärts durch sie blättern können (vielleicht durch Drücken der Vorwärts - und Rückwärts - Tasten oder mit Die Maus). Momentan muss ich jedes Bild separat speichern und dann mit einem separaten Bildbetrachter durch die Bilder scrollen. Gibt es eine Möglichkeit, dies vollständig innerhalb von Python zu tun?Blättern durch Matplotlib Plots

+0

Ist die Zeit, die benötigt wird, um die Plots live zu generieren, zu lang, um genau das zu tun? I.e. 'drücken Sie einen Knopf -> erzeugen Sie ein Diagramm -> zeigen Sie es' an und so weiter. –

+0

@AleksanderLidtke Ich kann sie live erzeugen, aber wie blättere ich die von mir erstellten Plots vor und zurück? – phoenix

+0

Rückrufe. Siehe http://matplotlib.org/users/event_handling.html. Wie es aussieht, ist diese Frage zu weit gefasst. – tacaswell

Antwort

9

Ein einfacher Weg, das zu erreichen, ist in einer Liste ein Tupel des x- und y-Arrays zu speichern und dann ein Handler-Ereignis verwenden, die das nächste (x, y) Paar zu aufgetragen nimmt:

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 diesem Code wähle ich die right und left Pfeile zu iterieren, aber Sie können sie ändern.

+0

Vielen Dank jabaldonedo --- Ihr Beispiel ist jetzt in meinem Projekt und so kann ich für andere bestätigen, dass es funktioniert. In meinem Fall ist 'key_event' eine Schließung innerhalb einer Schließung innerhalb eines Decorators. Ich verstehe die Ursache nicht - also hilf mir, es ist keine falsche Interpunktion am Ende der vorherigen Zeile ---, aber ich bekam immer den "globalen Namen' curr_pos' nicht definiert ", obwohl es eindeutig durch' curr_pos 'definiert ist = 0'. Ich entschied mich für eine Lösung in der Form 'falls nicht hasattr (key_event," curr_pos "): key_event.curr_pos = 0' anstelle von' global curr_pos'. Ich würde 'key_event .__ dict __ = {}' verwenden, um bei Bedarf zurückzusetzen. –

Verwandte Themen