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

4 minutos de lectura

avatar de usuario de southoz
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?

Avatar de usuario de David Zwicker
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.

Avatar de usuario de Heberto Mayorquin
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

Avatar de usuario de Felipe
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?

¿Ha sido útil esta solución?