Quando usar cla (), clf () ou close () para limpar um gráfico no matplotlib?

O Matplotlib oferece suas funções:

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

A documentação não oferece muitos insights sobre qual é a diferença entre essas funções. Quando devo usar cada function e o que exatamente ela faz?

   

    Todos eles fazem coisas diferentes, já que o matplotlib usa uma ordem hierárquica na qual uma janela de figura contém uma figura que pode consistir em muitos eixos. Além disso, existem funções da interface do pyplot e existem methods na class Figure . Vou discutir os dois casos abaixo.

    interface pyplot

    pyplot é um módulo que coleta algumas funções que permitem que o matplotlib seja usado de maneira funcional. Eu suponho aqui que pyplot foi importado como import matplotlib.pyplot as plt . Neste caso, existem três comandos diferentes que removem coisas:

    plt.cla() limpa um eixo , isto é, os eixos atualmente ativos na figura atual. Deixa os outros eixos intocados.

    plt.clf() limpa toda a figura atual com todos os seus eixos, mas deixa a janela aberta, de modo que ela possa ser reutilizada para outras plotagens.

    plt.close() fecha uma janela , que será a janela atual, se não especificada de outra forma.

    As funções mais adequadas para você dependem, portanto, do seu caso de uso.

    A function close() além disso permite que se especifique qual janela deve ser fechada. O argumento pode ser um número ou nome dado a uma janela quando foi criado usando a figure(number_or_name) ou pode ser uma figura de figura fig obtida, ou seja, usando fig = figure() . Se nenhum argumento for dado para close() , a janela ativa no momento será fechada. Além disso, existe a syntax close('all') , que fecha todas as figuras.

    methods da class Figure

    Além disso, a class Figure fornece methods para limpar figuras. Vou assumir no seguinte que fig é uma instância de uma Figure :

    fig.clf() limpa a figura inteira . Essa chamada é equivalente a plt.clf() somente se o fig for a figura atual.

    fig.clear() é um sinônimo para fig.clf()

    Note que mesmo del fig não fechará a janela de figura associada. Tanto quanto eu sei, a única maneira de fechar uma janela de figura é usando plt.close(fig) como descrito acima.

    Há apenas uma ressalva que eu descobri hoje. Se você tem uma function que está chamando uma plotagem muitas vezes é melhor usar plt.close(fig) invés de fig.clf() alguma forma a primeira não se acumula na memory. Em suma, se a memory é uma preocupação use plt.close (fig.) (Embora pareça que existem maneiras melhores, vá até o final deste comentário para links relevantes).

    Portanto, o script a seguir produzirá uma lista vazia:

     for i in range(5): fig = plot_figure() plt.close(fig) # This returns a list with all figure numbers available print(plt.get_fignums()) 

    Considerando que este irá produzir uma lista com cinco algarismos.

     for i in range(5): fig = plot_figure() fig.clf() # This returns a list with all figure numbers available print(plt.get_fignums()) 

    Da documentação acima não está claro para mim qual é a diferença entre fechar uma figura e fechar uma janela. Talvez isso vai esclarecer.

    Se você quiser experimentar um script completo, você tem:

     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()) 

    Se a memory é uma preocupação que alguém já postou uma solução alternativa em SO, veja: Crie uma figura que é referência contada