matplotlibのプロットをクリアするためにcla()、clf()またはclose()を使用する場合


542

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

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

ドキュメントはこれらの関数の違いが何であるかについて多くの洞察を提供していません。各関数を使用する必要があるのはいつですか?

回答:


714

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

pyplotインターフェース

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

plt.cla()Axes、つまり現在のFigureで現在アクティブなAxesをクリアします。他の軸はそのままです。

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

plt.close()特に指定されていない場合は、現在のウィンドウになるウィンドウを閉じます

したがって、どの関数が最も適しているかは、ユースケースによって異なります。

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

Figureクラスのメソッド

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

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

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

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


38
のでclose()、非特異的なコマンドですが、私はフィギュアの閉鎖(指定する方法を探して行ってきましたfig.close()関数ではありませんが)。正しい構文は次のとおりですplt.close(fig)
tyleha 2013

についてはclear()cla()寄生虫の軸のみcla()が特別に扱われていることとの違いはあまりありません
ダッシュ1995

1
私にはclear()機能がありませんmatplotlib.pyplot(MacOSのバージョン1.4.2)。関連するドキュメントに案内してもらえますか?
David Zwicker 2014

2
FigureとAxesクラスの両方にclear()メソッドがあります。Figure.clear同等clfAxes.clear同等ですcla
SiggyF

2
これはjupyterに関して機能しますか?jupyterでセルを再実行すると、数字がガベージコレクションされないため、メモリエラーが発生し続けます。
CMCDragonkai 2017年

79

今日私が発見した警告があります。プロットを何度も呼び出す関数がある場合は、何とかして最初の関数がメモリに蓄積されない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で回避策を投稿している: 参照カウントされる図を作成する


26
参照カウントの質問への役立つ相互参照をありがとう。それこそが、Matplotlib 既に機能しているはずです。数値が標準pyplotAPI でガベージコレクションされないことも、同様に恐ろしくて恐ろしいことです。
2016

1
それにもかかわらず、アニメーション(たとえば、2Dコンター/ pcolormeshマップ)を作成する必要がある場合は、古い図形パネルを閉じて新しい図形パネルを作成するのではなく、図形をクリアして新しいフィールドを描画する方がよいことを発見しました。速度は完全に異なります。
msi_gerva 2018

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.