Setelah instruksi ini dalam interpreter Python satu mendapat jendela dengan plot:
from matplotlib.pyplot import *
plot([1,2,3])
show()
# other code
Sayangnya, saya tidak tahu bagaimana cara terus mengeksplorasi angka yang dibuat show()
sementara program melakukan perhitungan lebih lanjut.
Apakah mungkin? Terkadang perhitungannya panjang dan akan membantu jika mereka akan melanjutkan selama pemeriksaan hasil antara.
python
matplotlib
plot
meteore
sumber
sumber
ion()
perbaikan masalah.os.fork()
tetapi perlu diingat bahwa menggunakanos.fork()
bisa rumit karena Anda membuat proses baru dengan menyalin proses lama.Jawaban:
Gunakan
matplotlib
panggilan yang tidak akan memblokir:Menggunakan
draw()
:Menggunakan mode interaktif:
sumber
draw()
tidak berfungsi untuk saya, tidak membuka jendela apa pun. Namun menggunakanshow(block=False)
bukannyadraw()
tampaknya melakukan trik di matplotlib 1.1.draw()
tidak bekerja untuk saya juga, hanyapause(0.001)
melakukan: stackoverflow.com/questions/28269157/…Gunakan kata kunci 'blok' untuk mengganti perilaku pemblokiran, mis
untuk melanjutkan kode Anda.
sumber
Lebih baik untuk selalu memeriksa dengan perpustakaan yang Anda gunakan jika mendukung penggunaan dengan cara yang tidak menghalangi .
Tetapi jika Anda menginginkan solusi yang lebih umum, atau jika tidak ada cara lain, Anda dapat menjalankan apa pun yang menghalangi dalam proses yang terpisah dengan menggunakan
multprocessing
modul yang termasuk dalam python. Perhitungan akan berlanjut:Yang memiliki overhead meluncurkan proses baru, dan kadang-kadang sulit untuk debug pada skenario yang kompleks, jadi saya lebih memilih solusi lain (menggunakan
matplotlib
's panggilan API nonblocking )sumber
if __name__ == '__main__':
?Mencoba
The
show()
dokumentasi mengatakan:sumber
PENTING : Hanya untuk memperjelas sesuatu. Saya berasumsi bahwa perintah berada di dalam
.py
skrip dan skrip dipanggil menggunakan mispython script.py
dari konsol.Cara sederhana yang bekerja untuk saya adalah:
Contoh
script.py
file:sumber
Anda mungkin ingin membaca dokumen ini dalam
matplotlib
dokumentasi, berjudul:Menggunakan matplotlib dalam shell python
sumber
Dalam kasus saya, saya ingin memiliki beberapa jendela yang muncul saat mereka sedang dihitung. Untuk referensi, ini caranya:
PS. Panduan yang cukup berguna untuk antarmuka OO matplotlib .
sumber
Yah, saya mengalami kesulitan besar mencari tahu perintah non-blocking ... Tapi akhirnya, saya berhasil mengolah kembali " Cookbook / Matplotlib / Animasi - Animating elemen plot yang dipilih " contoh, sehingga bekerja dengan thread ( dan mengirimkan data antara thread baik melalui variabel global, atau melalui multiproses
Pipe
) di Python 2.6.5 di Ubuntu 10.04.Skrip dapat ditemukan di sini: Animating_selected_plot_elements-thread.py - jika tidak ditempel di bawah ( dengan lebih sedikit komentar ) untuk referensi:
Semoga ini bisa membantu seseorang,
Ceria!
sumber
Dalam banyak kasus, lebih mudah menyimpan gambar sebagai file .png pada hard drive. Inilah alasannya:
Keuntungan:
Kekurangan:
sumber
Jika Anda bekerja di konsol, yaitu
IPython
Anda dapat menggunakanplt.show(block=False)
sebagaimana ditunjukkan dalam jawaban lain. Tetapi jika Anda malas, Anda bisa mengetik:Yang akan sama.
sumber
Saya juga harus menambahkan
plt.pause(0.001)
kode saya agar benar-benar berfungsi di dalam for for loop (jika tidak, hanya akan menampilkan plot pertama dan terakhir):sumber
Pada sistem saya show () tidak memblokir, meskipun saya ingin skrip menunggu pengguna untuk berinteraksi dengan grafik (dan mengumpulkan data menggunakan callback 'pick_event') sebelum melanjutkan.
Untuk memblokir eksekusi sampai jendela plot ditutup, saya menggunakan yang berikut:
Namun, perhatikan bahwa canvas.start_event_loop_default () menghasilkan peringatan berikut:
meskipun skripnya masih berjalan.
sumber
Saya juga ingin plot saya untuk menampilkan menjalankan sisa kode (dan kemudian terus menampilkan) bahkan jika ada kesalahan (kadang-kadang saya menggunakan plot untuk debugging). Saya membuat kode hack kecil ini sehingga setiap plot di dalam
with
pernyataan ini berperilaku seperti itu.Ini mungkin agak terlalu non-standar dan tidak disarankan untuk kode produksi. Mungkin ada banyak "gotcha" tersembunyi dalam kode ini.
Jika / ketika saya menerapkan "biarkan plot tetap terbuka (bahkan jika terjadi kesalahan) dan izinkan plot baru ditampilkan", saya ingin skrip keluar dengan benar jika tidak ada campur tangan pengguna yang memberi tahu sebaliknya (untuk tujuan eksekusi batch).
Saya dapat menggunakan sesuatu seperti pertanyaan time-out "End of script! \ NTekan p jika Anda ingin output ploting dijeda (Anda memiliki 5 detik):" dari /programming/26704840/corner -cases-for-my-wait-for-user-input-interupsi-implementasi .
sumber
sumber
OP bertanya tentang mengirim
matplotlib
plot. Sebagian besar jawaban menganggap eksekusi perintah dari dalam interpreter python. Use-case yang disajikan di sini adalah preferensi saya untuk menguji kode di terminal (misalnya bash) di mana afile.py
dijalankan dan Anda ingin plot (s) muncul tetapi skrip python untuk menyelesaikan dan kembali ke prompt perintah.File yang berdiri sendiri ini digunakan
multiprocessing
untuk meluncurkan proses terpisah untuk memplot datamatplotlib
. Utas utama keluar menggunakan yangos._exit(1)
disebutkan dalam posting ini . Theos._exit()
kekuatan utama untuk keluar tapi daunmatplotlib
proses anak hidup dan responsif sampai jendela plot ditutup. Ini adalah proses yang terpisah sepenuhnya.Pendekatan ini sedikit mirip dengan sesi pengembangan Matlab dengan jendela angka yang muncul dengan prompt perintah responsif. Dengan pendekatan ini, Anda telah kehilangan semua kontak dengan proses jendela angka, tetapi, itu tidak masalah untuk pengembangan dan debugging. Tutup saja jendela dan terus pengujian.
multiprocessing
dirancang untuk eksekusi kode hanya python yang membuatnya mungkin lebih cocok daripadasubprocess
.multiprocessing
adalah cross-platform sehingga ini harus bekerja dengan baik di Windows atau Mac dengan sedikit atau tanpa penyesuaian. Tidak perlu memeriksa sistem operasi yang mendasarinya. Ini diuji di linux, Ubuntu 18.04LTS.Menjalankan
file.py
menampilkan jendela gambar, lalu__main__
keluar tetapi jendelamultiprocessing
+matplotlib
gambar tetap responsif dengan zoom, pan, dan tombol lainnya karena ini adalah proses yang independen.Periksa proses di bash command prompt dengan:
ps ax|grep -v grep |grep file.py
sumber
.daemon=False
seperti yang dijelaskan di sini stackoverflow.com/a/49607287/1476932 Namun,sys.exit()
tidak menghentikan proses induk seperti yang dijelaskan di sana sampai saya menutup jendela anak. Di sisi lain menggunakanos._exit(0)
dari contoh di atas berhasil.Menurut pendapat saya, jawaban di utas ini menyediakan metode yang tidak berfungsi untuk setiap sistem dan dalam situasi yang lebih kompleks seperti animasi. Saya menyarankan untuk melihat jawaban MiKTeX di utas berikut, di mana metode yang kuat telah ditemukan: Bagaimana cara menunggu sampai animasi matplotlib berakhir?
sumber
Jika Anda ingin membuka beberapa angka, sambil tetap membuka semuanya, kode ini berfungsi untuk saya:
sumber
Meskipun tidak secara langsung menjawab permintaan OP, saya memposting solusi ini karena dapat membantu seseorang dalam situasi ini:
untuk Im ini menggunakan:
Di mana "var" mengidentifikasi plot di loop sehingga tidak akan ditimpa.
sumber
Gunakan
plt.show(block=False)
, dan di akhir panggilan skrip Andaplt.show()
.Ini akan memastikan bahwa jendela tidak akan ditutup ketika skrip selesai.
sumber