¿Cuándo usar cla (), clf () o close () para borrar un gráfico en matplotlib?

Matplotlib ofrece funciones allí:

cla() # Clear axis clf() # Clear figure close() # Close a figure window 

La documentación no ofrece mucha información sobre la diferencia entre estas funciones. ¿Cuándo debería usar cada función y qué es exactamente lo que hace?

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 la clase Figure . Discutiré ambos casos a continuación.

interfaz pyplot

pyplot es un módulo que recostack un par de funciones que permiten que matplotlib se use de manera funcional. Supongo que pyplot se ha importado como import matplotlib.pyplot as plt . En este caso, hay tres comandos diferentes que eliminan cosas:

plt.cla() borra un eje , es decir, los ejes actualmente activos en la figura actual. Deja los otros ejes sin tocar.

plt.clf() borra toda la figura actual con todos sus ejes, pero deja la ventana abierta, de modo que puede reutilizarse para otros gráficos.

plt.close() cierra una ventana , que será la ventana actual, si no se especifica lo contrario.

Qué funciones se adapten mejor a usted depende de su caso de uso.

La función close() además permite especificar qué ventana debe cerrarse. El argumento puede ser un número o nombre dado a una ventana cuando se creó con la figure(number_or_name) o puede ser una figura instancia de fig obtenida, es decir, usando fig = figure() . Si no se da ningún argumento para close() , la ventana actualmente activa se cerrará. Además, está la syntax close('all') , que cierra todas las figuras.

métodos de la clase de figura

Además, la clase Figure proporciona métodos para borrar figuras. Asumiré en lo siguiente que fig es una instancia de una Figure :

fig.clf() borra la figura completa . Esta llamada es equivalente a plt.clf() solo si fig es la figura actual.

fig.clear() es un sinónimo de fig.clf()

Tenga en cuenta que incluso del fig no cerrará la ventana de figura asociada. Hasta donde yo sé, la única manera de cerrar una ventana de figura es usando plt.close(fig) como se describe arriba.

Solo hay una advertencia que descubrí hoy. Si tiene una función que está llamando a un diagtwig muchas veces, es mejor utilizar plt.close(fig) lugar de fig.clf() alguna manera el primero no se acumula en la memoria. En resumen, si la memoria es una preocupación use plt.close (fig) (Aunque parece que hay mejores formas, vaya al final de este comentario para obtener enlaces relevantes).

Entonces, el siguiente script generará 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 figuras en él.

 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 tengo claro cuál es la diferencia entre cerrar una figura y cerrar una ventana. Tal vez eso aclarará.

Si quieres probar un script completo, 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 ha publicado una solución alternativa en SO ver: Crear una figura que sea referencia contada