Saya mencoba memplot beberapa data dari kamera secara real time menggunakan OpenCV. Namun, plot waktu nyata (menggunakan matplotlib) tampaknya tidak berfungsi.
Saya telah mengisolasi masalahnya ke dalam contoh sederhana ini:
fig = plt.figure()
plt.axis([0, 1000, 0, 1])
i = 0
x = list()
y = list()
while i < 1000:
temp_y = np.random.random()
x.append(i)
y.append(temp_y)
plt.scatter(i, temp_y)
i += 1
plt.show()
Saya berharap contoh ini akan memplot 1000 poin secara individual. Apa yang sebenarnya terjadi adalah bahwa jendela muncul dengan titik pertama yang menunjukkan (ok dengan itu), kemudian menunggu loop selesai sebelum mengisi seluruh grafik.
Adakah pemikiran mengapa saya tidak melihat poin diisi satu per satu?
plt.axis()
tapi buat dua daftar x dan y dan panggilplt.plot(x,y)
2. di loop Anda, tambahkan nilai data baru ke dua daftar 3. panggilanplt.gca().lines[0].set_xdata(x); plt.gca().lines[0].set_ydata(y); plt.gca().relim(); plt.gca().autoscale_view(); plt.pause(0.05);
Jika Anda tertarik untuk merencanakan waktu nyata, saya sarankan melihat ke dalam API animasi matplotlib . Secara khusus, menggunakan
blit
untuk menghindari menggambar ulang latar belakang pada setiap frame dapat memberi Anda keuntungan kecepatan yang substansial (~ 10x):Keluaran:
sumber
plt.show()
danplt.draw()
. Saya telah menambahkan perubahan ini ke kode di atas.blit()
kelihatannya sangat "meningkatkan perencanaan waktu nyata"? Jika Anda memiliki pengembang / blog matplotlib membahas mengapa / tujuan / niat / motivasi yang akan menjadi besar. (Sepertinya operasi blit baru ini akan mengubah Matplotlib dari hanya digunakan untuk offline atau sangat lambat mengubah data untuk sekarang Anda dapat menggunakan Matplotlib dengan data pembaruan yang sangat cepat ... hampir seperti osiloskop).Saya tahu saya agak terlambat untuk menjawab pertanyaan ini. Namun demikian, saya telah membuat beberapa kode beberapa waktu lalu untuk memplot grafik langsung, yang ingin saya bagikan:
Kode untuk PyQt4:
Saya baru-baru ini menulis ulang kode untuk PyQt5.
Kode untuk PyQt5:
Coba saja. Salin-tempel kode ini dalam file python baru, dan jalankan. Anda harus mendapatkan grafik yang indah dan bergerak dengan lancar:
sumber
dataSendLoop
utas terus berjalan di latar belakang ketika Anda menutup jendela. Jadi saya menambahkandaemon = True
kata kunci untuk mengatasi masalah itu.conda install pyqt=4
lakukan triknya.show
mungkin bukan pilihan terbaik untuk ini. Apa yang akan saya lakukan adalah menggunakannyapyplot.draw()
. Anda juga mungkin ingin memasukkan sedikit waktu tunda (misalnya,time.sleep(0.05)
) dalam loop sehingga Anda dapat melihat plot terjadi. Jika saya membuat perubahan pada contoh Anda ini berfungsi untuk saya dan saya melihat setiap titik muncul satu per satu.sumber
Tidak ada metode yang bekerja untuk saya. Tapi saya telah menemukan plot matplotlib Real time ini tidak berfungsi saat masih dalam satu lingkaran
Yang Anda butuhkan hanyalah menambahkan
dan kemudian Anda bisa melihat plot baru.
Jadi kode Anda akan terlihat seperti ini, dan itu akan berfungsi
sumber
Jawaban teratas (dan banyak lainnya) dibangun di atas
plt.pause()
, tetapi itu adalah cara lama menghidupkan plot di matplotlib. Ini tidak hanya lambat, tetapi juga menyebabkan fokus untuk diambil pada setiap pembaruan (saya mengalami kesulitan menghentikan proses merencanakan python).TL; DR: Anda mungkin ingin menggunakan
matplotlib.animation
( sebagaimana disebutkan dalam dokumentasi ).Setelah menggali berbagai jawaban dan potongan kode, ini sebenarnya terbukti menjadi cara yang mulus untuk menggambar data yang masuk tak terhingga bagi saya.
Ini kode saya untuk memulai dengan cepat. Ini memplot waktu saat ini dengan angka acak dalam [0, 100) setiap 200 ms tanpa batas, sambil juga menangani penskalaan otomatis tampilan:
Anda juga dapat menjelajahi
blit
untuk kinerja yang lebih baik seperti dalam dokumentasi FuncAnimation .Contoh dari
blit
dokumentasi:sumber
for i in range(1000): x,y = some func_func()
. Di sinisome_func()
menghasilkanx,y
pasangan data online , yang ingin saya plot setelah tersedia. Apakah mungkin melakukan ini denganFuncAnimation
. Tujuan saya adalah untuk membangun kurva yang ditentukan oleh data langkah demi langkah dengan setiap iterasi.pyploy.show()
harus memblokir. Jika Anda ingin menambahkan data, ambil dan perbaruiupdate
fungsinya.pyplot.show
dalam satu lingkaran, loop tersebut akan diblokir oleh panggilan ini dan tidak akan melanjutkan. Jika Anda ingin menambahkan data ke kurva langkah demi langkah, masukkan logika Andaupdate
, yang akan dipanggil setiapinterval
sehingga juga langkah-demi-langkah.Saya tahu pertanyaan ini sudah lama, tetapi sekarang ada paket yang disebut drawow on GitHub sebagai "python-drawow". Ini memberikan antarmuka yang mirip dengan drawow MATLAB - Anda dapat dengan mudah memperbarui gambar.
Contoh untuk kasus penggunaan Anda:
python-drawow adalah pembungkus tipis
plt.draw
tetapi menyediakan kemampuan untuk mengkonfirmasi (atau debug) setelah tampilan gambar.sumber
Masalahnya tampaknya Anda berharap
plt.show()
untuk menunjukkan jendela dan kemudian kembali. Itu tidak melakukan itu. Program akan berhenti pada titik itu dan hanya melanjutkan setelah Anda menutup jendela. Anda harus dapat mengujinya: Jika Anda menutup jendela dan kemudian jendela lain akan muncul.Untuk mengatasi masalah itu, panggil
plt.show()
sekali saja setelah loop Anda. Maka Anda mendapatkan plot lengkap. (Tapi bukan 'merencanakan waktu nyata')Anda dapat mencoba mengatur argumen kata kunci
block
seperti ini:plt.show(block=False)
sekali di awal dan kemudian gunakan.draw()
untuk memperbarui.sumber
Ini adalah versi yang saya dapat kerjakan di sistem saya.
Garis drawow (makeFig) dapat diganti dengan makeFig (); urutan plt.draw () dan masih berfungsi OK.
sumber
Jika Anda ingin menggambar dan tidak membekukan utas Anda karena lebih banyak titik yang ditarik, Anda harus menggunakan plt.pause () bukan time.sleep ()
Saya menggunakan kode berikut untuk merencanakan serangkaian koordinat xy.
sumber
Pilihan lain adalah pergi dengan bokeh . IMO, ini adalah alternatif yang baik setidaknya untuk plot waktu nyata. Berikut ini adalah versi bokeh dari kode dalam pertanyaan:
dan untuk menjalankannya:
bokeh menunjukkan hasilnya di browser web melalui komunikasi websocket. Ini sangat berguna ketika data dihasilkan oleh proses server tanpa kepala jarak jauh.
sumber
Contoh use-case untuk merencanakan penggunaan CPU secara real-time.
sumber