Kapan menggunakan cla (), clf () atau close () untuk membersihkan plot di matplotlib?

542

Matplotlib menawarkan fungsi di sana:

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

Dokumentasi tidak menawarkan banyak wawasan tentang apa perbedaan antara fungsi-fungsi ini. Kapan saya harus menggunakan setiap fungsi dan apa fungsinya?

southoz
sumber

Jawaban:

714

Mereka semua melakukan hal yang berbeda, karena matplotlib menggunakan urutan hierarkis di mana jendela gambar berisi gambar yang dapat terdiri dari banyak sumbu. Selain itu, ada fungsi dari antarmuka pyplot dan ada metode di Figurekelas. Saya akan membahas kedua kasus di bawah ini.

antarmuka pyplot

pyplotadalah modul yang mengumpulkan beberapa fungsi yang memungkinkan matplotlib untuk digunakan secara fungsional. Saya di sini berasumsi bahwa pyplottelah diimpor sebagai import matplotlib.pyplot as plt. Dalam hal ini, ada tiga perintah berbeda yang menghapus barang:

plt.cla()membersihkan sumbu , yaitu sumbu yang saat ini aktif dalam gambar saat ini. Itu membuat sumbu lainnya tidak tersentuh.

plt.clf()membersihkan seluruh gambar saat ini dengan semua sumbunya, tetapi membiarkan jendela terbuka, sehingga dapat digunakan kembali untuk plot lainnya.

plt.close() menutup jendela , yang akan menjadi jendela saat ini, jika tidak ditentukan sebaliknya.

Fungsi mana yang paling cocok untuk Anda tergantung pada use-case Anda.

The close()Fungsi selanjutnya memungkinkan seseorang untuk menentukan jendela yang harus ditutup. Argumen dapat berupa angka atau nama yang diberikan ke jendela saat dibuat menggunakan figure(number_or_name)atau bisa berupa contoh figur yang figdiperoleh, yaitu menggunakan fig = figure(). Jika tidak ada argumen yang diberikan close(), jendela yang sedang aktif akan ditutup. Selanjutnya ada sintaksisnyaclose('all') , yang menutup semua angka.

metode kelas Gambar

Selain itu, Figurekelas menyediakan metode untuk membersihkan angka. Saya akan menganggap berikut figini yang merupakan contoh dari Figure:

fig.clf()membersihkan seluruh gambar . Panggilan ini setara dengan plt.clf()hanya jika figangka saat ini.

fig.clear() adalah sinonim untuk fig.clf()

Perhatikan bahwa bahkan del figtidak akan menutup jendela gambar yang terkait. Sejauh yang saya tahu satu-satunya cara untuk menutup jendela gambar menggunakan plt.close(fig)seperti yang dijelaskan di atas.

David Zwicker
sumber
38
Karena close()ini adalah perintah yang tidak spesifik, saya mencari cara untuk menentukan angka penutupan ( fig.close()bukan fungsi). Sintaks yang benar adalah: plt.close(fig).
tyleha
bagaimana clear(), saya belum melihat banyak perbedaan dengan cla()hanya bahwa pada kapak parasit hanya cla()diperlakukan secara khusus.
dashesy
1
Tidak ada clear()fungsi di saya matplotlib.pyplot(Versi 1.4.2 di MacOS). Bisakah Anda mengarahkan saya ke dokumentasi terkait?
David Zwicker
2
Kelas Figure dan Axes memiliki clear()metode. The Figure.clearsetara dengan clfdan Axes.clearsetara dengan cla.
SiggyF
2
Apakah ini berfungsi untuk jupyter? Saya terus memukul kesalahan memori karena angka tidak menjadi sampah yang dikumpulkan ketika saya menjalankan kembali sel di jupyter.
CMCDragonkai
79

Hanya ada peringatan yang saya temukan hari ini. Jika Anda memiliki fungsi yang memanggil plot banyak kali Anda lebih baik menggunakan plt.close(fig)daripada fig.clf()entah bagaimana yang pertama tidak menumpuk di memori. Singkatnya jika memori adalah masalah, gunakan plt.close (ara) (Meskipun tampaknya ada cara yang lebih baik, lanjutkan ke akhir komentar ini untuk tautan yang relevan).

Jadi skrip berikut akan menghasilkan daftar kosong:

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

Sedangkan yang satu ini akan menghasilkan daftar dengan lima angka di atasnya.

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

Dari dokumentasi di atas tidak jelas bagi saya apa perbedaan antara menutup angka dan menutup jendela. Mungkin itu akan menjelaskan.

Jika Anda ingin mencoba skrip lengkap di sana Anda memiliki:

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

Jika ingatan adalah masalah, seseorang sudah memposting pekerjaan di SO, lihat: Buat angka yang referensi dihitung

Ramon Martinez
sumber
26
Terima kasih atas referensi silang yang bermanfaat untuk pertanyaan penghitungan referensi. Begitulah seharusnya Matplotlib bekerja. Ini sama menakutkan dan mengerikan bahwa angka tidak pernah sampah dikumpulkan di bawah pyplotAPI standar .
Cecil Curry
1
Namun demikian, saya telah menemukan bahwa jika seseorang harus membuat animasi (misalnya beberapa peta kontur / pcolormesh 2D) lebih baik untuk menghapus gambar dan menggambar bidang baru daripada menutup yang lama dan membuat panel gambar baru. Kecepatannya akan sangat berbeda.
msi_gerva