web-dev-qa-db-fra.com

Fermer les fenêtres pyplot

Édition finale:

Ce que j'ai trouvé au sujet de la fermeture des fenêtres pyplot, c'est que cela ne devrait probablement pas être fait en utilisant pyplot. SRK donne un excellent exemple sur la façon de gérer les tracés qui seront mis à jour dans sa réponse ci-dessous. J'ai également découvert comment placer des parcelles pyplot dans une fenêtre Tkinter, et Tkinter est beaucoup plus apte à ouvrir et fermer des fenêtres que pyplot. Ici comment mettre un graphique pyplot dans une fenêtre Tk aussi c'est un bon exemple .

/ Édition finale

Je voudrais pouvoir afficher plusieurs tracés et ensuite pouvoir les fermer (supprimer de l'écran) individuellement à partir d'une entrée de code, mais je ne connais pas l'entrée de code pour ce faire.

Voici ce que j'ai essayé jusqu'à présent. J'ai joué avec la position des commandes show et close, mais le seul vrai résultat que j'en ai obtenu est que l'un ou l'autre tracé ne s'affiche pas, mais je n'ai pas pu supprimer un tracé de l'écran. J'ai inséré un raw_input () pour créer des pauses.

Edit: Ces parcelles sont appelées à partir d'un gui Tkinter et s'il y a une meilleure façon de le faire dans cette direction, je serais heureux de l'entendre.

Toute contribution serait appréciée, merci.

import matplotlib.pyplot as plt

a = range(0,10)
b = range(0,20,2)
c = range(0,30,3)
d = range(0,40,4)

plot1 = plt.figure()
plt.plot(a,b, 'r-o')

plt.show()

plt.close()

plot2 = plt.figure()
plt.plot(c,d, 'b-o')

plt.show()
plt.close() 

Modifier le code: cela n'a pas fonctionné non plus.

plot1 = plt.figure(1)
plt.plot(a,b, 'r-o')

plot2 = plt.figure(2)
plt.plot(c,d, 'b-o')
#plt.close(1)
#this will prevent plot1 from being displayed
plt.show()
plt.close(1)  # or ('all') or (plot1)
35
deadstump

plt.close() fermera l'instance actuelle.

plt.close(2) fermera la figure 2

plt.close(plot1) fermera la figure avec l'instance plot1

plt.close('all') fermera tous les fichiers

Trouvé ici .

N'oubliez pas que plt.show() est une fonction bloquante, donc dans l'exemple de code que vous avez utilisé ci-dessus, plt.close() n'est pas exécuté tant que la fenêtre n'est pas fermée, ce qui le rend redondant.

Vous pouvez utiliser plt.ion() au début de votre code pour le rendre non bloquant, bien que cela ait d'autres implications.

EXEMPLE

Après notre discussion dans les commentaires, j'ai rassemblé un petit exemple juste pour montrer comment la fonctionnalité de tracé peut être utilisée.

Ci-dessous, je crée un tracé:

fig = plt.figure(figsize=plt.figaspect(0.75))
ax = fig.add_subplot(1, 1, 1)
....
par_plot, = plot(x_data,y_data, lw=2, color='red')

Dans ce cas, ax ci-dessus est une poignée pour une paire d'axes. Chaque fois que je veux faire quelque chose pour ces axes, je peux changer mon ensemble actuel d'axes pour cet ensemble particulier en appelant axes(ax).

par_plot Est un descripteur de l'instance line2D. C'est ce qu'on appelle un artiste. Si je veux changer une propriété de la ligne, comme changer les ydata, je peux le faire en me référant à cette poignée.

Je peux également créer un widget curseur en procédant comme suit:

axsliderA = axes([0.12, 0.85, 0.16, 0.075])
sA = Slider(axsliderA, 'A', -1, 1.0, valinit=0.5)
sA.on_changed(update)

La première ligne crée un nouvel axe pour le curseur (appelé axsliderA), la deuxième ligne crée une occurrence de curseur sA qui est placée dans les axes et la troisième ligne spécifie une fonction à appeler lorsque la valeur du curseur change (update).

Ma fonction de mise à jour pourrait ressembler à ceci:

def update(val):
    A = sA.val
    B = sB.val
    C = sC.val
    y_data = A*x_data*x_data + B*x_data + C
    par_plot.set_ydata(y_data)
    draw()

La par_plot.set_ydata(y_data) modifie les ydata propriété de l'objet Line2D avec la poignée par_plot.

La fonction draw() met à jour le jeu d'axes actuel .

Mettre tous ensemble:

from pylab import *
import matplotlib.pyplot as plt
import numpy

def update(val):
    A = sA.val
    B = sB.val
    C = sC.val
    y_data = A*x_data*x_data + B*x_data + C
    par_plot.set_ydata(y_data)
    draw()


x_data = numpy.arange(-100,100,0.1);

fig = plt.figure(figsize=plt.figaspect(0.75))
ax = fig.add_subplot(1, 1, 1)
subplots_adjust(top=0.8)

ax.set_xlim(-100, 100);
ax.set_ylim(-100, 100);
ax.set_xlabel('X')
ax.set_ylabel('Y')

axsliderA = axes([0.12, 0.85, 0.16, 0.075])
sA = Slider(axsliderA, 'A', -1, 1.0, valinit=0.5)
sA.on_changed(update)

axsliderB = axes([0.43, 0.85, 0.16, 0.075])
sB = Slider(axsliderB, 'B', -30, 30.0, valinit=2)
sB.on_changed(update)

axsliderC = axes([0.74, 0.85, 0.16, 0.075])
sC = Slider(axsliderC, 'C', -30, 30.0, valinit=1)
sC.on_changed(update)

axes(ax)
A = 1;
B = 2;
C = 1;
y_data = A*x_data*x_data + B*x_data + C;

par_plot, = plot(x_data,y_data, lw=2, color='red')

show()

Une note à propos de ce qui précède: lorsque j'exécute l'application, le code s'exécute séquentiellement (il stocke la fonction update en mémoire, je pense), jusqu'à ce qu'il atteigne show (), qui est bloquant. Lorsque vous apportez une modification à l'un des curseurs, il exécute la fonction de mise à jour de la mémoire (je pense?).

C'est la raison pour laquelle show () est implémenté tel quel, afin que vous puissiez modifier les valeurs en arrière-plan en utilisant des fonctions pour traiter les données.

64
stanri