Cuándo usar cla(), clf() o close() para borrar un gráfico
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?
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 métodos en la Figure
clase. Discutiré ambos casos a continuación.
interfaz de trazado de datos
pyplot
es un módulo que recopila un par de funciones que permiten utilizar matplotlib de manera funcional. Aquí asumo que pyplot
se ha 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 los otros ejes intactos.plt.clf()
borra toda la figura actual con todos sus ejes , pero deja la ventana abierta, de modo que pueda reutilizarse para otros gráficos.plt.close()
cierra una ventana , que será la ventana actual, si no se especifica lo contrario.
Por lo tanto, las funciones que más le convengan dependen de su caso de uso.
Además, la close()
función permite especificar qué ventana debe cerrarse. El argumento puede ser un número o nombre dado a una ventana cuando se creó usando figure(number_or_name)
o puede ser una instancia de figura fig
obtenida, es decir, usando fig = figure()
. Si no se da ningún argumento close()
, se cerrará la ventana actualmente activa. Además está la sintaxis close('all')
, que cierra todas las figuras.
métodos de la clase Figura
Además, la Figure
clase proporciona métodos para borrar cifras. Asumiré a continuación que fig
es una instancia de Figure
:
fig.clf()
borra toda la figura . Esta convocatoria equivale a plt.clf()
sólo si fig
es la cifra actual.
fig.clear()
es un sinonimo defig.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 usar plt.close(fig)
como se describe arriba.
Sólo hay una advertencia que descubrí hoy. Si tiene una función que llama a un gráfico muchas veces, es mejor que la use plt.close(fig)
en lugar de que fig.clf()
de alguna manera la primera no se acumule en la memoria. En resumen, si le preocupa la memoria, utilice plt.close(fig) (Aunque parece que hay mejores formas, vaya al final de este comentario para ver 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 éste 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. Quizás 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 le preocupa la memoria, alguien ya publicó una solución alternativa en SO, consulte: Crear una figura que se cuente por referencia