Bagaimana saya memberi tahu matplotlib bahwa saya sudah selesai dengan plot?

165

Kode berikut memplot ke dua file PostScript (.ps), tetapi yang kedua berisi kedua baris.

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.subplot(111)
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("first.ps")


plt.subplot(111)
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")

Bagaimana saya bisa memberi tahu matplotlib untuk memulai kembali dari plot kedua?

Stefano Borini
sumber
3
sebagai titik gaya, tidak perlu menggunakan subplot ketika Anda hanya memiliki satu plot per gambar.
Autoplectic

Jawaban:

123

Anda dapat menggunakan figureuntuk membuat plot baru, misalnya, atau menggunakan closesetelah plot pertama.

David Cournapeau
sumber
19
Tutorial pyplot tidak menyebutkan clf () di bagian "beberapa gambar". Perhatikan bahwa jika Anda baru saja membuat plot baru dengan gambar () tanpa menutup yang lama dengan tutup () (bahkan jika Anda menutup jendela GUI), pyplot mempertahankan referensi ke gambar lama Anda, yang mungkin terlihat seperti kebocoran memori.
Jouni K. Seppänen
5
Anda dapat menggunakan plt.close () / pylab.close () untuk menghapus semua angka lama
Calvin1602
1
Setelah plot pertama, maksud Anda setelah plt.savefig("first.ps")?
Sigur
@ JouniK.Seppänen Hanya untuk menambah komentar Anda, Python secara default akan memperingatkan Anda jika Anda membuka banyak angka: "RuntimeWarning: Lebih dari 20 angka telah dibuka.".
rph
173

Ada perintah angka yang jelas, dan itu harus dilakukan untuk Anda:

plt.clf()

Jika Anda memiliki beberapa subplot dalam gambar yang sama

plt.cla()

membersihkan sumbu saat ini.

Randlet
sumber
1
Terima kasih! Jika Anda menggunakan backend PDF (yang memungkinkan Anda menyimpan banyak plot), Anda harus memanggil ini setelah setiap panggilan ke plt.save ()
Ben DeMott
4
Dalam kasus saya, plt.clf () sudah cukup untuk menghapus angka tetapi tidak cukup untuk menghentikan kebocoran memori, tetapi pertama-tama memanggil plt.close () menghentikan kebocoran memori. Python 2.7, matplotlib 1.1.1rc1 (ubuntu 12.04). FYI.
DJDuff
29

Seperti yang dinyatakan dari David Cournapeau, gunakan gambar ().

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.figure()
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("first.ps")


plt.figure()
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")

Atau subplot (121) / subplot (122) untuk plot yang sama, posisi berbeda.

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.subplot(121)
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")

plt.subplot(122)
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")
lmount
sumber
3
Anda masih harus menggunakan plt.clf(), angka disimpan dalam memori sampai ditutup secara eksplisit
kaveish
13

Cukup masukkan plt.hold(False)sebelum plt.plot pertama, dan Anda dapat tetap menggunakan kode asli Anda.

Dirklinux
sumber
6
di matplotlib == 2.0.2, saya mendapatkan pesan ini: MatplotlibDeprecationWarning: pyplot.hold sudah usang.
Jonathan
12

Jika Anda menggunakan Matplotlib secara interaktif, misalnya dalam aplikasi web, (misalnya ipython), Anda mungkin mencari

plt.show()

bukannya plt.close()atau plt.clf().

Damo
sumber
Anda baru saja menyelamatkan saya banyak waktu, saya tidak harus kehilangan
lihat kembali
1

Jika tidak ada yang berfungsi maka periksa ini .. katakan jika Anda memiliki array data x dan y di sepanjang masing-masing sumbu. Kemudian periksa sel mana (jupyter) yang telah Anda inisialisasi x dan y untuk mengosongkan. Ini karena, mungkin Anda menambahkan data ke x dan y tanpa menginisialisasi ulang mereka. Jadi plot juga memiliki data lama. Jadi periksa itu ..

Seenivasan
sumber