2016-06-29 2 views
0

Je veux simplement mettre une clause de pause à mon intrigue où je peux mettre en pause le flux temps réel volontairement. C'est ce que j'essaie. Ceci est un code édité. Il fait deux intrigues secondaires: scatter et camembert. Je suis capable de mettre en pause le nuage de points mais quand je fais une pause, le graphique à secteurs disparaît.sur pause de clic le graphique en temps réel de données

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

[Ce] (http://stackoverflow.com/questions/11874767/real-time-plotting-in-while-loop-with-matplotlib) SO question pourrait vous aider. La réponse acceptée a quelque chose à propos de la pause, que vous pourriez probablement utiliser dans votre propre code avec un peu de peaufinage. – kirkpatt

+0

@kirkpatt: Je suis capable de faire une pause dans mon flux temps réel mais je veux faire une pause externe comme en cliquant sur la souris ou en utilisant le clavier. – nezz

Répondre

0

Il existe des méthodes plus élégantes de parvenir (à l'aide matplotlib.animation, voir par exemple ceci: https://stackoverflow.com/a/16733373/3581217 réponse), mais dans l'esprit de l'exemple que vous avez fourni, cela fonctionne fonctionnellement:

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) 

Le astuce consiste à faire pause une variable global (vous ne mettiez dans votre fonction onClick, mais aussi à l'intérieur de la boucle ...?), la fonction permet de basculer onClick (^=) pause entre True/False, et basé sur l'état de pause vous soit "faire des choses" ou non.

Mais encore une fois, il serait plus logique de se pencher sur matplotlib.animation ...

EDIT en fonction des commentaires ci-dessous Je ne vois pas où votre code mise à jour va mal; cet exemple minimal met à jour les graphiques scatter et pie sans problème.

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

Salut @bart: Maintenant, je peux mettre en pause les tracés, mais le problème auquel je suis confronté est que mon diagramme de dispersion est mis en pause et montre la figure fixe mais le camembert (une autre sous-carte) disparaît. Comment surmonter ce problème. Merci – nezz

+0

Vous devrez nous fournir plus d'informations/code, sinon nous devrons faire des suppositions très sauvages sur ce qui * pourrait * aller mal. – Bart

+0

Salut @bart J'ai édité mon post .. S'il vous plaît regarder dans le. Je fais deux intrigues secondaires: diagramme de dispersion et camembert. Maintenant, je suis en mesure de faire une pause dans l'intrigue, mais camembert disparaît quand je fais une pause et il apparaît à nouveau quand je reclick pour commencer l'intrigue. Merci – nezz