Saya telah bermain dengan Numpy dan matplotlib dalam beberapa hari terakhir. Saya mengalami masalah saat mencoba membuat plot plot fungsi tanpa memblokir eksekusi. Saya tahu sudah ada banyak utas di sini tentang SO yang mengajukan pertanyaan serupa, dan saya sudah cukup banyak mencari di Google tetapi belum berhasil membuat ini berhasil.
Saya telah mencoba menggunakan show (block = False) seperti yang disarankan beberapa orang, tetapi yang saya dapatkan hanyalah jendela beku. Jika saya cukup memanggil show (), hasilnya diplot dengan benar tetapi eksekusi diblokir sampai jendela ditutup. Dari utas lain yang saya baca, saya curiga apakah show (block = False) berfungsi atau tidak tergantung pada backend. Apakah ini benar? Bagian belakang saya adalah Qt4Agg. Bisakah Anda melihat kode saya dan memberi tahu saya jika Anda melihat sesuatu yang salah? Ini kode saya. Terima kasih atas bantuannya.
from math import *
from matplotlib import pyplot as plt
print plt.get_backend()
def main():
x = range(-50, 51, 1)
for pow in range(1,5): # plot x^1, x^2, ..., x^4
y = [Xi**pow for Xi in x]
print y
plt.plot(x, y)
plt.draw()
#plt.show() #this plots correctly, but blocks execution.
plt.show(block=False) #this creates an empty frozen window.
_ = raw_input("Press [enter] to continue.")
if __name__ == '__main__':
main()
PS. Saya lupa mengatakan bahwa saya ingin memperbarui jendela yang ada setiap kali saya merencanakan sesuatu, alih-alih membuat yang baru.
sumber
plt.ion()
sebelumnyaplt.show()
? Ini kemudian harus non-blocking karena setiap plot ditelurkan ke thread anak.matplotlib
.Jawaban:
Saya menghabiskan waktu yang lama mencari solusi, dan menemukan jawaban ini .
Sepertinya, untuk mendapatkan apa yang Anda (dan saya) inginkan, Anda memerlukan kombinasi
plt.ion()
,plt.show()
(bukan denganblock=False
) dan, yang paling penting,plt.pause(.001)
(atau waktu apa pun yang Anda inginkan). The jeda diperlukan karena peristiwa GUI terjadi sedangkan kode utama sedang tidur, termasuk menggambar. Mungkin saja ini diimplementasikan dengan mengambil waktu dari thread tidur, jadi mungkin IDE mengacaukannya — saya tidak tahu.Berikut ini adalah implementasi yang berfungsi untuk saya di python 3.5:
sumber
plt.draw
mengikutiplt.show(block = False)
tetapi kemudian berhenti bekerja: Gambar tidak merespons, menutupnya jatuh iPython. Solusi saya menghapus setiap instanceplt.draw()
dan menggantinyaplt.pause(0.001)
. Alih-alih diikuti olehplt.show(block = False)
sepertiplt.draw
sebelumnya, itu didahului olehplt.ion()
danplt.show()
. Saya sekarang memilikiMatplotlibDeprecationWarning
tetapi membiarkan saya memplot angka saya, jadi saya senang dengan solusi ini.raw_input
tidakinput
. Lihat di siniTrik sederhana yang bekerja untuk saya adalah sebagai berikut:
Contoh :
Catatan :
plt.show()
adalah baris terakhir dari skrip saya.sumber
Anda dapat menghindari memblokir eksekusi dengan menulis plot ke array, lalu menampilkan array di utas yang berbeda. Berikut adalah contoh membuat dan menampilkan plot secara bersamaan menggunakan pf.screen dari pyformulas 0.2.8 :
Hasil:
Penafian: Saya adalah pengelola pyformulas.
Referensi: Matplotlib: save plot to numpy array
sumber
Banyak dari jawaban ini sangat menggembung dan dari apa yang dapat saya temukan, jawabannya tidak terlalu sulit untuk dipahami.
Anda dapat menggunakan
plt.ion()
jika Anda ingin, tetapi saya menemukan menggunakanplt.draw()
sama efektifnyaUntuk proyek spesifik saya, saya sedang merencanakan gambar, tetapi Anda dapat menggunakan
plot()
atauscatter()
atau apa punfigimage()
, itu tidak masalah.Atau
Jika Anda menggunakan angka yang sebenarnya.
Saya menggunakan @ krs013, dan jawaban @Default Picture untuk mencari tahu.
Semoga ini menyelamatkan seseorang dari meluncurkan setiap gambar pada utas terpisah, atau dari harus membaca novel ini hanya untuk mencari tahu ini
sumber
Merencanakan hidup
jika jumlah data terlalu banyak, Anda dapat menurunkan kecepatan pembaruan dengan penghitung sederhana
Memegang Plot setelah Program Keluar
Ini adalah masalah saya yang sebenarnya yang tidak dapat menemukan jawaban yang memuaskan, saya ingin merencanakan yang tidak menutup setelah skrip selesai (seperti MATLAB),
Jika Anda memikirkannya, setelah skrip selesai, program diakhiri dan tidak ada cara logis untuk menahan plot dengan cara ini, jadi ada dua opsi
ini tidak memuaskan bagi saya jadi saya menemukan solusi lain di luar kotak
SaveToFile dan Lihat di penampil eksternal
Untuk ini, penyimpanan dan tampilan harus cepat dan pemirsa tidak boleh mengunci file dan memperbarui konten secara otomatis
Memilih Format untuk Menyimpan
format berbasis vektor kecil dan cepat
Penampil Ringan Cepat dengan Pembaruan Langsung
Untuk PDF ada beberapa opsi bagus
Pada Windows saya menggunakan SumatraPDF yang gratis, cepat dan ringan (hanya menggunakan 1,8 MB RAM untuk kasus saya)
Di Linux ada beberapa opsi seperti Evince (GNOME) dan Ocular (KDE)
Kode Sampel & Hasil
Kode sampel untuk menghasilkan plot ke file
setelah pertama kali dijalankan, buka file output di salah satu pemirsa yang disebutkan di atas dan nikmati.
Berikut ini adalah screenshot VSCode bersama SumatraPDF, juga prosesnya cukup cepat untuk mendapatkan tingkat pembaruan semi-live (saya bisa mendekati 10Hz pada pengaturan saya hanya menggunakan
time.sleep()
antar interval)sumber
Jawaban Iggy adalah yang termudah untuk saya ikuti, tetapi saya mendapatkan kesalahan berikut ketika melakukan
subplot
perintah berikutnya yang tidak ada ketika saya hanya melakukanshow
:Untuk menghindari kesalahan ini, ada baiknya menutup (atau menghapus ) plot setelah pengguna masuk.
Inilah kode yang berfungsi untuk saya:
sumber
Paket Python drawow memungkinkan untuk memperbarui plot secara real time dengan cara yang tidak menghalangi.
Ini juga berfungsi dengan webcam dan OpenCV misalnya untuk merencanakan langkah-langkah untuk setiap frame.
Lihat posting asli .
sumber