Saya membuat aplikasi dengan Python yang mengumpulkan data dari port serial dan memplot grafik dari data yang dikumpulkan terhadap waktu kedatangan. Waktu kedatangan data tidak pasti. Saya ingin plot diperbarui saat data diterima. Saya mencari cara melakukan ini dan menemukan dua metode:
- Kosongkan plot dan gambar kembali plot dengan semua poinnya lagi.
- Menganimasikan plot dengan mengubahnya setelah interval tertentu.
Saya tidak lebih suka yang pertama karena program berjalan dan mengumpulkan data untuk waktu yang lama (misalnya sehari), dan menggambar ulang plot akan sangat lambat. Yang kedua juga tidak disukai karena waktu kedatangan data tidak pasti dan saya ingin plot diperbarui hanya ketika data diterima.
Apakah ada cara di mana saya dapat memperbarui plot hanya dengan menambahkan lebih banyak poin ke dalamnya hanya ketika data diterima?
python
matplotlib
tkinter
Shadman Anwer
sumber
sumber
Jawaban:
Ada beberapa cara untuk menganimasikan data di matplotlib, bergantung pada versi yang Anda miliki. Pernahkah Anda melihat contoh buku masak matplotlib ? Juga, lihat contoh animasi yang lebih modern di dokumentasi matplotlib. Terakhir, API animasi mendefinisikan fungsi FuncAnimation yang menganimasikan fungsi dalam waktu. Fungsi ini hanya bisa menjadi fungsi yang Anda gunakan untuk memperoleh data Anda.
Setiap metode pada dasarnya menyetel
data
properti objek yang sedang digambar, jadi tidak perlu membersihkan layar atau gambar. Thedata
properti hanya dapat diperpanjang, sehingga Anda dapat menjaga poin sebelumnya dan hanya terus menambah baris Anda (atau gambar atau apapun yang Anda menggambar).Mengingat bahwa Anda mengatakan bahwa waktu kedatangan data Anda tidak pasti, taruhan terbaik Anda mungkin hanya melakukan sesuatu seperti:
Kemudian ketika Anda menerima data dari port serial panggil saja
update_line
.sumber
Untuk melakukan ini tanpa FuncAnimation (misalnya Anda ingin mengeksekusi bagian lain dari kode saat plot sedang diproduksi atau Anda ingin memperbarui beberapa plot pada saat yang sama), memanggil
draw
saja tidak menghasilkan plot (setidaknya dengan qt backend).Pekerjaan berikut untuk saya:
sumber
%matplotlib notebook
perintah ajaib setelah pernyataan import matplotlib Anda.Berikut adalah cara yang memungkinkan untuk menghilangkan titik setelah sejumlah titik diplot:
sumber
Saya tahu saya terlambat menjawab pertanyaan ini, tetapi untuk masalah Anda, Anda dapat melihat ke dalam paket "joystick". Saya merancangnya untuk memplot aliran data dari port serial, tetapi berfungsi untuk aliran apa pun. Ini juga memungkinkan untuk pencatatan teks interaktif atau plot gambar (selain grafik plot). Tidak perlu melakukan loop Anda sendiri di utas terpisah, paket akan menanganinya, cukup berikan frekuensi pembaruan yang Anda inginkan. Ditambah terminal tetap tersedia untuk memantau perintah saat merencanakan. Lihat http://www.github.com/ceyzeriat/joystick/ atau https://pypi.python.org/pypi/joystick (gunakan joystick pip install untuk menginstal)
Cukup ganti np.random.random () dengan titik data asli Anda yang dibaca dari port serial pada kode di bawah ini:
sumber