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

Resuelto southoz asked hace 13 años • 4 respuestas

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?

southoz avatar Nov 21 '11 21:11 southoz
Aceptado

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

interfaz de trazado de datos

pyplotes un módulo que recopila un par de funciones que permiten utilizar matplotlib de manera funcional. Aquí asumo que pyplotse ha importado como import matplotlib.pyplot as plt. En este caso, hay tres comandos diferentes que eliminan cosas:

Ver matplotlib.pyplotFunciones:

  • 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 figobtenida, 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 Figureclase proporciona métodos para borrar cifras. Asumiré a continuación que figes una instancia de Figure:

fig.clf()borra toda la figura . Esta convocatoria equivale a plt.clf()sólo si figes la cifra actual.

fig.clear()es un sinonimo defig.clf()

Tenga en cuenta que incluso del figno 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.

David Zwicker avatar Nov 22 '2011 14:11 David Zwicker

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

Heberto Mayorquin avatar Oct 26 '2015 10:10 Heberto Mayorquin