web-dev-qa-db-ja.com

Matplotlibでプロトコルを消去するのにcla()、clf()、またはclose()を使用する場合

Matplotlibはそこに機能を提供します:

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

ドキュメンテーションはこれらの機能の違いが何であるかについて多くの洞察を提供しません。各機能をいつ使用する必要がありますか。

429
southoz

Matplotlibは、Figureウィンドウに多くの軸で構成されている可能性があるFigureが含まれるという階層的な順序を使用するため、これらはすべて異なる動作をします。さらに、pyplotインターフェースからの関数とFigureクラス上のメソッドがあります。両方の場合について以下で説明します。

pyplotインターフェース

pyplotは、matplotlibを機能的に使用できるようにするいくつかの関数を集めるモジュールです。ここではpyplotimport matplotlib.pyplot as pltとしてインポートされたと仮定します。この場合、ものを削除する3つの異なるコマンドがあります。

plt.cla()はAxes 、すなわち現在のFigureの現在アクティブなAxesをクリアします。それは他の斧をそのままにします。

plt.clf()は現在の図形全体 をそのすべての軸でクリアしますが、ウィンドウは開いたままにしておくので、他のプロットに再利用できます。

plt.close()はウィンドウ を閉じます。特に指定がなければ、これが現在のウィンドウになります。

どの関数があなたに最も適しているかはあなたのユースケースに依存します。

close()関数はさらにどのウィンドウを閉じるべきかを指定することを可能にします。引数は、figure(number_or_name)を使用して作成されたときにウィンドウに与えられた番号または名前、あるいはfigを取得したFigureインスタンス、つまりusingfig = figure()のいずれかです。 close()に引数が与えられていない場合、現在アクティブなウィンドウは閉じられます。さらに、すべての図を閉じる構文close('all')があります。

figureクラスのメソッド

さらに、Figureクラスは数値をクリアするためのメソッドを提供します。以下ではfigFigureのインスタンスであると仮定します。

fig.clf()は図全体をクリアしますfigが現在の数値である場合にのみ、この呼び出しはplt.clf()と同等です。

fig.clear()fig.clf()の同義語です。

del figでも関連するFigureウィンドウを閉じないことに注意してください。私が知る限りでは、Figureウィンドウを閉じる唯一の方法は、上記のようにplt.close(fig)を使うことです。

568
David Zwicker

私が今日発見したのは、警告だけです。プロットを何度も呼び出す関数がある場合は、plt.close(fig)ではなくfig.clf()を使用したほうがよいでしょう。どういうわけか、最初の関数はメモリに蓄積されません。要するに メモリが気になる場合はplt.close(fig) を使用してください(より良い方法があるようですが、関連リンクについてはこのコメントの最後に進んでください)。

したがって、次のスクリプトは空のリストを作成します。

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

これは5つの数字を含むリストを作成しますが。

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

上のドキュメントから、Figureを閉じることとウィンドウを閉じることの違いは何か私にはわかりません。多分それははっきりするでしょう。

完全なスクリプトを試してみたい場合は、次のものがあります。

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

メモリが問題になる場合は、SOに誰かがすでに回避策を投稿しています。参照: 参照カウントの数字を作成します

63
Ramon Martinez

plt.cla() 現在の軸をクリアを意味する

plt.clf() 現在の図をクリアを意味する

また、 plt.gca() (現在の軸を取得)と plt.gcf() (現在の図を取得)があります。

ここでもっと読んでください: Matplotlib、Pyplot、Pylabなど:これらとの違いは何ですか?

6
Felipe Almeida