2016-06-29 3 views
0

Ich möchte einfach eine Pause-Klausel auf meinem Grundstück, wo ich den Echtzeit-Stream freiwillig anhalten kann. Das ist, was ich versuche. Dies ist ein bearbeiteter Code. Es macht zwei Subplots: Scatter und Tortendiagramm. Ich bin in der Lage, das Streudiagramm anzuhalten, aber wenn ich pausiere, verschwindet Kreisdiagramm.auf klicken Pause der Echtzeit-Datenplot

def onClick(event): 
    global pause 
    pause ^= True 
fig = plt.figure() 
fig.canvas.mpl_connect('button_press_event', onClick) 
plt.show() 

while t<ran2:  
     if not pause: 
     ax = fig.add_subplot(2,1,1) 
     ay = fig.add_subplot(2,1,2) 
     mdfmt = md.DateFormatter('%H:%M') 
     ax.xaxis.set_major_formatter(mdfmt) 
     cmap=cm.jet 
     g=s[t:t+4] 
     h=[] 
     for i in g: 
      if i == 'Match': 
       h.append(1) 
      else: 
       h.append(0) 
     ax.scatter(x[t:t+4],y[t:t+4],c=h,s=150,marker='<',edgecolor='None', cmap = cm.jet) 
     ax.set_xlabel('Time') 
     ax.set_ylabel('Action') 
     mindate = min(data_mat['Date'].ix[t:t+4]) 
     ax.set_title('Alarm System for site SPFD02 on date %s'%mindate) 
     yt=[-1,0,1] 
     ax.set_yticks(yt) 
     ax.set_yticklabels(('Closed','Not Ack','Assigned')) 
     ax.set_xlim(x[t],x[t+4])  

# for pie chart 
     l = 'Match','No-Match' 
     colors = ['red','blue'] 
     j = s[t:t+4].count('Match') 
     z = z + j 
     k = s[t:t+4].count('No-Match') 
     r = r + k 
     sizes = [z,r] 
     ay.pie(sizes,labels = l, colors = colors, autopct='%1.1f%%', shadow=True, startangle=140) 
     ay.set_aspect('equal')   
     t=t+1 
    else: 
     print 'paused' 
plt.pause(0.1) 
plt.cla() 
+0

[Dies] (http://stackoverflow.com/questions/11874767/real-time-plotting-in-while-loop-with-matplotlib) SO Frage könnte Ihnen helfen. Die akzeptierte Antwort hat etwas von Pausieren, das Sie wahrscheinlich mit ein wenig Optimierung in Ihrem eigenen Code verwenden könnten. – kirkpatt

+0

@kirkpatt: Ich kann meinem Echtzeit-Stream eine Pause geben, aber ich möchte extern anhalten, indem ich mit der Maus klicke oder die Tastatur benutze. – nezz

Antwort

0

Es gibt elegantere Methoden, dies zu erreichen (matplotlib.animation verwenden, siehe zB diese: https://stackoverflow.com/a/16733373/3581217 Antwort), aber im Geist des Beispiels, die Sie zur Verfügung gestellt, diese funktionell funktionieren:

import matplotlib.pylab as pl 

pause = False 

def onClick(event): 
    global pause 
    pause ^= True 

fig = pl.figure() 
fig.canvas.mpl_connect('button_press_event', onClick) 

nt = 100 
t = 0 
while t < nt: 
    if not pause: 
     # do stuff 
     print("update plot!") 
     t += 1 
    else: 
     print("paused") 
    pl.pause(0.1) 

Die Trick ist pause eine global Variable (Sie wurden Einstellung in Ihrer onClick Funktion, sondern auch innerhalb der Schleife ...?), die onClick Funktion schaltet (^=) pause zwischen True/False zu machen, und basierend auf dem Stand pause Sie entweder "Do stuff" oder nicht.

Aber auch hier könnte es mehr Sinn machen, in matplotlib.animation aussehen ...

EDIT basierend auf Kommentare unten ich nicht sehen, wo Ihre aktualisierte Code schief geht; Dieses minimale Beispiel aktualisiert die Karten scatter und pie ohne Probleme.

import matplotlib.pylab as plt 
import numpy as np 

pause = False 

def onClick(event): 
    global pause 
    pause ^= True 

fig = plt.figure() 
fig.canvas.mpl_connect('button_press_event', onClick) 

nt = 100 
x = np.random.random(nt+4) 
y = np.random.random(nt+4) 
s = np.random.random(nt+4) 

t = 0 
while t < nt: 
    if not pause: 
     ax = fig.add_subplot(2,1,1) 
     ay = fig.add_subplot(2,1,2) 

     ax.scatter(x[t:t+4], y[t:t+4]) 
     ay.pie(s[t:t+4]) 
     t += 1 
    plt.pause(0.1) 
+0

Hallo @bart: Jetzt kann ich die Plots pausieren, aber das Problem, dem ich gegenüberstehe, ist, dass mein Streudiagramm pausiert und die stille Figur zeigt, aber das Tortendiagramm (ein anderes Subplot) verschwindet. Wie man dieses Problem löst. Danke – nezz

+0

Sie müssen uns mit mehr Info/Code versorgen, sonst müssten wir sehr wilde Vermutungen darüber machen, was schief gehen könnte. – Bart

+0

Hallo @bart Ich habe meinen Beitrag bearbeitet .. Bitte schauen Sie hinein. Ich mache zwei Subplots: Streudiagramm und Kreisdiagramm. Jetzt kann ich den Plot pausieren, aber das Kreisdiagramm verschwindet, wenn ich pausiere, und es erscheint wieder, wenn ich mich zurückdrehe, um den Plot zu starten. Danke – nezz