suroz
Matplotlib ofrece estas funciones:
cla() # Clear axis
clf() # Clear figure
close() # Close a figure window
¿Cuándo debo usar cada función y qué hace exactamente?
david zwicker
Todos hacen cosas diferentes, ya que matplotlib usa un orden jerárquico en el que una ventana de figura contiene una figura que puede constar de muchos ejes. Además, hay funciones de la interfaz pyplot y hay métodos en el Figure
clase. Hablaré de ambos casos a continuación.
interfaz pyplot
pyplot
es un módulo que recopila un par de funciones que permiten usar matplotlib de manera funcional. Aquí asumo que pyplot
ha sido importado como import matplotlib.pyplot as plt
. En este caso, hay tres comandos diferentes que eliminan cosas:
Ver matplotlib.pyplot
Funciones:
plt.cla()
borra un eje, es decir, el eje actualmente activo en la figura actual. Deja intactos los otros ejes.plt.clf()
borra toda la figura actual con todos sus ejespero deja la ventana abierta, de modo que se puede reutilizar para otras parcelas.plt.close()
cierra una ventanaque será la ventana actual, si no se especifica lo contrario.
Las funciones que más le convengan dependen, por lo tanto, de su caso de uso.
El close()
Además, la función permite especificar qué ventana debe cerrarse. El argumento puede ser un número o un nombre dado a una ventana cuando se creó usando figure(number_or_name)
o puede ser una instancia de figura fig
obtenidos, es decir, utilizandofig = figure()
. Si no se da ningún argumento a close()
, la ventana actualmente activa se cerrará. Además, existe la sintaxis close('all')
que cierra todas las figuras.
métodos de la clase Figure
Además, el Figure
La clase proporciona métodos para borrar cifras. Asumiré en lo siguiente que fig
es una instancia de un Figure
:
fig.clf()
borra toda la figura. Esta llamada es equivalente a plt.clf()
sólo si fig
es la cifra actual.
fig.clear()
es un sinonimo de fig.clf()
Tenga en cuenta que incluso del fig
no cerrará la ventana de la figura asociada. Hasta donde yo sé, la única forma de cerrar una ventana de figura es usando plt.close(fig)
como se describió anteriormente.
Heberto Mayorquín
Solo hay una advertencia que descubrí hoy. Si tiene una función que llama a un gráfico muchas veces, es mejor que use plt.close(fig)
en lugar de fig.clf()
de alguna manera el primero no se acumula en la memoria. En breve si la memoria es una preocupación, use plt.close(fig) (Aunque parece que hay mejores formas, vaya al final de este comentario para ver los enlaces relevantes).
Entonces, el siguiente script producirá una lista vacía:
for i in range(5):
fig = plot_figure()
plt.close(fig)
# This returns a list with all figure numbers available
print(plt.get_fignums())
Mientras que este producirá una lista con cinco cifras.
for i in range(5):
fig = plot_figure()
fig.clf()
# This returns a list with all figure numbers available
print(plt.get_fignums())
De la documentación anterior no me queda claro cuál es la diferencia entre cerrar una figura y cerrar una ventana. Tal vez eso aclare.
Si quieres probar un script completo ahí tienes:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1000)
y = np.sin(x)
for i in range(5):
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(x, y)
plt.close(fig)
print(plt.get_fignums())
for i in range(5):
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(x, y)
fig.clf()
print(plt.get_fignums())
Si la memoria es una preocupación, alguien ya publicó una solución alternativa en SO, vea: Crear una figura que se cuente como referencia
-
Gracias por la útil referencia cruzada a la pregunta de conteo de referencias. Así es exactamente como Matplotlib debería ya trabajo Es igualmente aterrador y espantoso que las cifras nunca se recolecten como basura bajo el estándar
pyplot
API.–Cecil Curry
4 de enero de 2016 a las 3:25
-
Sin embargo, he descubierto que si uno tiene que hacer animaciones (por ejemplo, algunos mapas 2D de contorno/malla de color) es mejor borrar la figura y dibujar nuevos campos en lugar de cerrar los paneles de figura antiguos y hacer nuevos. La velocidad será completamente diferente.
– msi_gerva
11/09/2018 a las 17:10
-
Gracias, mi problema se resolvió para la animación, tuve la duplicación de ejes en la trama que plt.cla() eliminó dentro de la función de animación.
– zaheer
27 oct 2022 a las 13:42
felipe
plt.cla() medio claro eje actual
plt.clf() medio cifra actual clara
también, hay plt.gca() (obtener el eje actual) y plt.gcf() (obtener la cifra actual)
Leer más aquí: Matplotlib, Pyplot, Pylab, etc.: ¿Cuál es la diferencia entre estos y cuándo usar cada uno?