Memanggil pylab.savefig tanpa tampilan di ipython

111

Saya perlu membuat gambar dalam file tanpa menampilkannya di dalam notebook IPython. Saya tidak jelas tentang interaksi antara IPythondan matplotlib.pylabdalam hal ini. Tapi, ketika saya menelepon pylab.savefig("test.png"), gambar saat ini ditampilkan selain disimpan di test.png. Saat mengotomatiskan pembuatan sekumpulan besar file plot, ini sering kali tidak diinginkan. Atau dalam situasi di mana file perantara untuk pemrosesan eksternal oleh aplikasi lain diinginkan.

Tidak yakin apakah ini pertanyaan matplotlibatau IPythonbuku catatan.

tnt
sumber
Jawaban dari @staticfloat berhasil untuk saya bahkan saat tidak berada di dalam notebook, dan saat menggunakan matplotlib melalui JuliaLang; menggunakanioff
Vass

Jawaban:

173

Ini adalah pertanyaan matplotlib, dan Anda bisa menyiasatinya dengan menggunakan backend yang tidak ditampilkan kepada pengguna, misalnya 'Agg':

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

plt.plot([1,2,3])
plt.savefig('/tmp/test.png')

EDIT: Jika Anda tidak ingin kehilangan kemampuan untuk menampilkan plot, matikan Mode Interaktif , dan panggil hanya plt.show()saat Anda siap untuk menampilkan plot:

import matplotlib.pyplot as plt

# Turn interactive plotting off
plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('/tmp/test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
plt.figure()
plt.plot([1,3,2])
plt.savefig('/tmp/test1.png')

# Display all "open" (non-closed) figures
plt.show()
staticfloat
sumber
2
Ok - tapi, saya biasanya ingin mempertahankan inline plotting dalam iPython. Saran Anda berfungsi dengan baik jika melakukan pengalihan penuh di backend. Pertanyaannya adalah bagaimana Anda mengizinkan situasi umum ploting sebaris dengan kasus luar biasa dari angka tabungan (tanpa menunjukkan sebaris). Dengan saran Anda, saya mencoba memuat ulang modul dan mengubah backend sementara tetapi tidak berhasil. Adakah ide tentang cara mengganti backend sementara dalam sesi notebook iPython?
tnt
1
Saya telah memperbarui pertanyaan untuk berbicara tentang plotting interaktif close()dan show()perintah dan , yang seharusnya menyelesaikan masalah Anda. mengganti backend dengan cepat tidak didukung, seperti yang telah Anda temukan.
staticfloat
3
Terima kasih atas umpan baliknya yang luar biasa. Tampaknya plt.close (fig) adalah perintah kunci untuk kebutuhan saya. Saya masih belum jelas tentang ioff karena tampaknya tidak memengaruhi operasi; tapi, saya mungkin melewatkan sesuatu. Terima kasih lagi.
tnt
1
Resep yang saya berikan adalah resep umum; jika Anda tidak bekerja di notebook ipython, plt.ioff () penting untuk menghentikan gambar berkedip-kedip di layar, seperti di baris perintah, angka ipython diplot segera setelah Anda memanggil plt.plot()jika mode interaktif aktif. Menonaktifkan mode interaktif akan menunda tampilan plot apa pun hingga plt.show(). Karena Anda menggunakan notebook ipython, mode interaktif diperlakukan berbeda.
staticfloat
Bagi saya, matplotlib.use('Agg')sendirilah yang berhasil. Saya tidak membutuhkan apapun plt.show()atau plt.ioff()dalam kode saya sama sekali.
Zhanwen Chen
67

Kami tidak perlu plt.ioff()atau plt.show()(jika kami menggunakan %matplotlib inline). Anda dapat menguji kode di atas tanpa plt.ioff(). plt.close()memiliki peran penting. Coba yang ini:

%matplotlib inline
import pylab as plt

# It doesn't matter you add line below. You can even replace it by 'plt.ion()', but you will see no changes.
## plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
fig2 = plt.figure()
plt.plot([1,3,2])
plt.savefig('test1.png')

Jika Anda menjalankan kode ini di iPython, ini akan menampilkan plot kedua, dan jika Anda menambahkan plt.close(fig2)di akhir, Anda tidak akan melihat apa-apa.

Kesimpulannya, jika Anda mendekati gambar plt.close(fig), itu tidak akan ditampilkan.

Mojtaba Khodadadi
sumber
5
Solusi yang lebih baik! Saya menghasilkan dan menyimpan banyak plot dalam satu lingkaran. Dengan plt.ioffsaya dapatkan RuntimeWarning: More than 20 figures have been opened.... plt.closemenyelesaikannya.
Nagasaki45