2009-11-14 7 views
2

J'ai un script qui trace les données de certaines ouvertures de photométrie, et je veux les tracer dans une parcelle xy. J'utilise matplotlib.pyplot avec python 2.5.Cesser animation matplotlib.pyplot gracieusement

Les données d'entrée sont stockées dans environ 500 fichiers et lues. Je suis conscient que ce n'est pas la façon la plus efficace de la saisie des données, mais c'est une autre question ...

Exemple Code:

import matplotlib.pyplot as plt 

xcoords = [] 
ycoords = [] 

# lists are populated with data from first file 

pltline, = plt.plot(xcoords, ycoords, 'rx') 

# then loop populating the data from each file 

for file in filelist: 
    xcoords = [...] 
    ycoords = [...] 

pltline.set_xdata(xcoords) 
pltline.set_ydata(ycoords) 
plt.draw() 

Comme il y a plus de 500 fichiers, je vais de temps en temps envie de fermer la fenêtre d'animation au milieu du tracé. Mon code pour tracer fonctionne mais il ne sort pas très gracieusement. La fenêtre de tracé ne répond pas à un clic sur le bouton de fermeture et je dois en sortir Ctrl+C.

Quelqu'un peut-il me aider à trouver un moyen de fermer la fenêtre d'animation tandis que le script est en cours d'exécution tout en regardant gracieux (bien plus gracieux qu'une série d'erreurs de retraçage python)?

Répondre

2

Si vous mettez à jour les données et faire le tirage au sort dans une boucle, vous devriez pouvoir l'interrompre. Voici un exemple (qui dessine un cercle fixe et se déplace une ligne autour du périmètre):

from pylab import * 
import time 

data = [] # make the data 
for i in range(1000): 
    a = .01*pi*i+.0007 
    m = -1./tan(a) 
    x = arange(-3, 3, .1) 
    y = m*x 
    data.append((clip(x+cos(a), -3, 3),clip(y+sin(a), -3, 3))) 


for x, y in data: # make a dynamic plot from the data 
    try: 
     plotdata.set_data(x, y) 
    except NameError: 
     ion() 
     fig = figure() 
     plot(cos(arange(0, 2.21*pi, .2)), sin(arange(0, 2.21*pi, .2))) 
     plotdata = plot(x, y)[0] 
     xlim(-2, 2) 
     ylim(-2, 2) 
    draw() 
    time.sleep(.01) 

je mets dans la commande time.sleep(.01) être très sûr que je pouvais briser la course, mais dans mes tests (sous Linux) ce n'était pas nécessaire.

+0

Lorsque j'essaie d'exécuter votre programme, le tracé clignote à l'écran et le programme déclenche une erreur de type: NoneType non itérable car le tableau de données contient des Nones –

+0

A droite, il y a eu une faute de frappe. Je l'ai réparé et cela devrait fonctionner maintenant. – tom10

Questions connexes