python - tamaño - Cierre de las ventanas de pyplot
matplotlib guia (1)
Edición final:
Lo que encontré sobre el tema de cerrar ventanas de pyplot es que probablemente no debería hacerse usando pyplot. SRK ofrece un excelente ejemplo de cómo manejar las parcelas que se actualizarán en su respuesta a continuación. También me he topado con cómo colocar gráficas de parásitos en una ventana de Tkinter, y Tkinter es mucho más hábil para abrir y cerrar ventanas que pyplot. Aquí es cómo poner un diagrama de pyplot en una ventana Tk también este es un buen ejemplo .
/ Final Edit
Me gustaría poder mostrar varios gráficos y luego poder cerrarlos (quitarlos de la pantalla) individualmente de alguna entrada de código, pero no conozco la entrada del código para hacer esto.
Debajo está lo que he intentado hasta ahora. He jugado con la posición del show y los comandos de cierre, pero el único resultado real que he obtenido de esto es que uno o el otro argumento no aparecen, pero no he podido eliminar un gráfico de la pantalla. He estado insertando un raw_input () para crear pausas.
Editar: Estas tramas están siendo llamadas desde una guía de Tkinter y si hay una forma mejor de hacerlo desde esa dirección, me alegraría escucharlo.
Cualquier entrada sería apreciada, gracias.
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()
Código de edición: Esto tampoco funcionó.
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)
plt.close()
cerrará la instancia actual.
plt.close(2)
cerrará la figura 2
plt.close(plot1)
cerrará la figura con la instancia plot1
plt.close(''all'')
cerrará todas las fiures
Encontrado here .
Recuerde que plt.show()
es una función de bloqueo , por lo que en el código de ejemplo que utilizó anteriormente, plt.close()
no se está ejecutando hasta que se cierre la ventana, lo que lo hace redundante.
Puede usar plt.ion()
al principio de su código para que no sea bloqueante, aunque esto tiene otras implicaciones.
EJEMPLO
Después de nuestra discusión en los comentarios, puse un poco de ejemplo solo para demostrar cómo se puede usar la funcionalidad de la trama.
A continuación, creo un diagrama:
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'')
En este caso, el ax
anterior es un mango para un par de ejes. Cada vez que deseo hacer algo con estos ejes, puedo cambiar mi conjunto actual de ejes a este conjunto particular llamando axes(ax)
.
par_plot
es un identificador para la instancia de line2D. Esto se llama un artista. Si quiero cambiar una propiedad de la línea, como cambiar los ydata, puedo hacerlo consultando este manejador.
También puedo crear un widget de control deslizante haciendo lo siguiente:
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 primera línea crea un nuevo eje para el control deslizante (llamado axsliderA
), la segunda línea crea una instancia de control deslizante sA
que se coloca en los ejes, y la tercera línea especifica una función para llamar cuando el valor del control deslizante cambia ( update
).
Mi función de actualización podría verse más o menos así:
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()
par_plot.set_ydata(y_data)
cambia la propiedad ydata del objeto Line2D con el identificador par_plot
.
La función draw()
actualiza el conjunto actual de ejes.
Poniendolo todo junto:
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()
Una nota sobre lo anterior: cuando ejecuto la aplicación, el código se ejecuta secuencialmente a la derecha (almacena la función de update
en la memoria, creo), hasta que aparece show (), que está bloqueando. Cuando realiza un cambio en uno de los controles deslizantes, ejecuta la función de actualización desde la memoria (¿o sí?).
Esta es la razón por la cual show () se implementa tal como está, de modo que puede cambiar los valores en segundo plano mediante el uso de funciones para procesar los datos.