Matplotlib'deki bir arsa temizlemek için cla (), clf () veya close () ne zaman kullanılır?


541

Matplotlib orada fonksiyonlar sunar:

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

Belgeler, bu işlevler arasındaki farkın ne olduğu konusunda çok fazla fikir vermiyor. Her bir işlevi ne zaman kullanmalıyım ve tam olarak ne işe yarar?

Yanıtlar:


713

Matplotlib, şekil penceresinin birçok eksenden oluşabilecek bir şekil içerdiği hiyerarşik bir düzen kullandığından hepsi farklı şeyler yapar. Ayrıca, pyplot arayüzünden fonksiyonlar vardır ve Figuresınıfta yöntemler vardır . Aşağıda her iki durumu da tartışacağım.

pyplot arayüzü

pyplotmatplotlib'in işlevsel bir şekilde kullanılmasına izin veren birkaç işlevi toplayan bir modüldür. Burada bunun pyplotolarak ithal edildiğini varsayıyorum import matplotlib.pyplot as plt. Bu durumda, şeyleri kaldıran üç farklı komut vardır:

plt.cla()bir ekseni , yani geçerli şekilde aktif olan eksenleri temizler . Diğer eksenlere dokunulmaz.

plt.clf()tüm mevcut şekli tüm eksenleriyle temizler , ancak pencereyi açık bırakır, böylece diğer grafikler için tekrar kullanılabilir.

plt.close()aksi belirtilmedikçe geçerli pencere olacak bir pencereyi kapatır .

Hangi işlevlerin size en uygun olduğu bu nedenle kullanım durumunuza bağlıdır.

close()Fonksiyon ayrıca bir kapatılmalıdır hangi pencere belirlemenizi sağlar. Bağımsız değişken, bir pencere oluşturulduğunda bir pencereye verilen bir sayı veya ad figure(number_or_name)olabilir veya figelde edilen bir şekil örneği , yani kullanılarak olabilir fig = figure(). Bir argüman verilmezse close(), o anda etkin olan pencere kapatılır. Ayrıca, close('all')tüm rakamları kapatan sözdizimi vardır .

Şekil sınıfının yöntemleri

Ayrıca, Figuresınıf rakamları temizlemek için yöntemler sağlar. Aşağıda bunun figbir örneği olduğunu varsayacağım Figure:

fig.clf()tüm rakamı temizler . Bu çağrı plt.clf()yalnızca figgeçerli rakam olduğunda eşdeğerdir .

fig.clear() ile eşanlamlıdır fig.clf()

del figİlişkili şekil penceresinin bile kapanmayacağını unutmayın . Bildiğim kadarıyla bir şekil penceresini kapatmanın tek yolu plt.close(fig)yukarıda açıklandığı gibidir.


38
Çünkü close()bir spesifik olmayan komut, ben rakam kapatılmasını belirtmek için bir yol aramaya başladı ( fig.close()bir işlev değil). Doğru sözdizimi şöyledir: plt.close(fig).
tyleha

ne hakkında clear(), ben cla()sadece parazit eksenlerinde sadece cla()özel tedavi ile çok fazla fark görmedim .
dashesy

1
Diye bir şey yok clear()benim, fonksiyon matplotlib.pyplot(MacOS üzerinde Versiyon 1.4.2). Beni ilgili belgelere yönlendirebilir misiniz?
David Zwicker

2
Hem Figure hem de Axes sınıfının bir clear()yöntemi vardır. İle Figure.cleareşdeğer clfve Axes.cleareşdeğerdir cla.
SiggyF

2
Bu jupyter ile ilgili olarak çalışıyor mu? Jupyter'da bir hücreyi tekrar çalıştırdığımda rakamlar çöp toplanmıyor olduğundan bellek hatalarına çarpmaya devam ediyorum.
CMCDragonkai

79

Bugün keşfettiğim bir uyarı var. Eğer bir çok kez arsa çağıran bir fonksiyonunuz varsa, bir şekilde plt.close(fig)yerine daha iyi kullanın fig.clf(), ilk bellekte birikmez. Kısacası bellek bir endişe ise plt.close (fig) kullanın (Daha iyi yollar var gibi görünse de, ilgili bağlantılar için bu yorumun sonuna gidin).

Aşağıdaki komut dosyası boş bir liste oluşturacaktır:

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

Oysa bu, üzerinde beş figür bulunan bir liste üretecektir.

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

Yukarıdaki belgelerden, bir rakamı kapatmak ve bir pencereyi kapatmak arasındaki farkın ne olduğu net değil. Belki bu açıklığa kavuşacaktır.

Komut dosyasını tam olarak denemek istiyorsanız:

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

Bellek bir kişi zaten SO'da bir çözüm gönderdi bir endişe ise bkz: Sayılan referans bir rakam oluşturma


26
Referans sayma sorusuna yardımcı çapraz referans için teşekkürler. Nasıl Matplotlib Bu tam olarak gerektiği zaten çalışır. Eşit derecede korkutucu ve dehşet verici ki, rakamlar asla standart pyplotAPI altında toplanmıyor .
Cecil Curry

1
Bununla birlikte, eğer animasyon yapmak gerekiyorsa (örneğin, bazı 2D kontur / pcolormesh haritaları), eski olanı kapatmak ve yeni şekil panelleri yapmak yerine figürü temizlemek ve yeni alanlar çizmek daha iyi olur. Hız tamamen farklı olacaktır.
msi_gerva

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.