2013-08-22 12 views
7

Mój kod generuje wiele wykresów z danych za pomocą matplotibu i chciałbym móc przewijać do przodu i do tyłu za ich pomocą w demonstracji na żywo (może poprzez naciśnięcie klawiszy do przodu i do tyłu lub za pomocą Mysz). Obecnie muszę zapisać każdy z nich osobno, a następnie użyć osobnej przeglądarki obrazów, aby je przewinąć. Czy istnieje sposób to zrobić w całości z poziomu Pythona?Przewiń do tyłu i do przodu przez działki matplotlib

+0

Czy czas na wygenerowanie działek jest zbyt długi, aby to zrobić? To znaczy. 'naciśnij przycisk -> wygeneruj wykres -> pokaż go i tak dalej. –

+0

@AleksanderLidtke Mogę je wygenerować na żywo, ale jak mogę przewijać do przodu i do tyłu przez kreślone przeze mnie wątki? – phoenix

+0

wywołania zwrotne. Zobacz http://matplotlib.org/users/event_handling.html. W tej kwestii to pytanie jest zbyt szerokie. – tacaswell

Odpowiedz

9

łatwy sposób osiągnąć, że zapisuje się na liście krotkę X i Y macierzy, a następnie użyć do obsługi zdarzeń, które odbiera kolejną (x, y), parę być naniesiona:

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

W tym kodzie wybieram strzały right ido iteracji, ale możesz je zmienić.

+0

Dziękuję bardzo jabaldonedo --- Twój przykład jest teraz w moim projekcie, więc mogę potwierdzić innym, że to działa. W moim przypadku "key_event" to zamknięcie w zamknięciu wewnątrz dekoratora. Nie rozumiem przyczyny - więc pomóżcie mi, że nie jest to błędna interpunkcja na końcu poprzedniej linijki - ale ciągle otrzymywałem "ogólną nazwę" curr_pos "nieokreśloną", niezależnie od tego, że jest to jasno zdefiniowane przez 'curr_pos = 0'. Zdecydowałem się na rozwiązanie w postaci 'if not hasattr (key_event," curr_pos "): key_event.curr_pos = 0' w miejsce' global curr_pos'. W razie potrzeby użyłbym 'key_event .__ dict __ = {}', aby zresetować. –

Powiązane problemy