Plot dinamis python dalam lingkaran

Menunggu untuk mengumpulkan pengukuran dari sensor sebelum memplotnya mungkin berhasil dalam beberapa situasi. Sering kali, Anda ingin dapat memantau keluaran sensor secara waktu nyata, yang berarti Anda dapat mencari tren saat itu terjadi. Untuk melakukannya, kami akan membuat animasi di mana sampel suhu diambil dan grafik segera diperbarui

Kode Animasi

Buka file baru (sekali lagi, pastikan berada di direktori yang sama dengan tmp102. py agar kita bisa menggunakan modul tmp102). Salin dalam kode berikut

language:python
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import tmp102

# Create figure for plotting
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
xs = []
ys = []

# Initialize communication with TMP102
tmp102.init()

# This function is called periodically from FuncAnimation
def animate(i, xs, ys):

    # Read temperature (Celsius) from TMP102
    temp_c = round(tmp102.read_temp(), 2)

    # Add x and y to lists
    xs.append(dt.datetime.now().strftime('%H:%M:%S.%f'))
    ys.append(temp_c)

    # Limit x and y lists to 20 items
    xs = xs[-20:]
    ys = ys[-20:]

    # Draw x and y lists
    ax.clear()
    ax.plot(xs, ys)

    # Format plot
    plt.xticks(rotation=45, ha='right')
    plt.subplots_adjust(bottom=0.30)
    plt.title('TMP102 Temperature over Time')
    plt.ylabel('Temperature (deg C)')

# Set up plot to call animate() function periodically
ani = animation.FuncAnimation(fig, animate, fargs=(xs, ys), interval=1000)
plt.show()

Simpan dan jalankan kode. Anda harus segera melihat grafik yang diperbarui setiap detik sekali. Jangan ragu untuk menghirup sensor untuk melihat bagaimana suhu berfluktuasi

Kode untuk Dicatat

Untuk membuat plot real-time, kita perlu menggunakan modul animation di matplotlib. Kami mengatur gambar dan sumbu dengan cara biasa, tetapi kami menggambar langsung ke sumbu, ax, saat kami ingin membuat bingkai baru dalam animasi

Di bagian bawah kode, Anda akan melihat saus rahasia untuk animasi

ani = animation.FuncAnimation(fig, animate, fargs=(xs, ys), interval=1000)

FuncAnimation adalah fungsi khusus dalam modul animation yang memungkinkan kita memperbarui grafik secara otomatis. Kami memberikan FuncAnimation() pegangan ke gambar yang ingin kami gambar, fig, serta nama fungsi yang harus dipanggil secara berkala. Kami menyebut fungsi ini animate()_ dan didefinisikan tepat di atas panggilan FuncAnimation() kami

Masih dalam parameter FuncAnimation(), kita menetapkan animation0, yang merupakan argumen yang ingin kita sampaikan ke fungsi animation1 kita (karena kita tidak memanggil animate() langsung dari dalam kode kita sendiri). Kemudian, kita menyetel animation3, yaitu berapa lama kita harus menunggu di antara panggilan ke animate() (dalam milidetik)

Catatan. Sebagai argumen untuk FuncAnimation, perhatikan bahwa animation1 tidak memiliki tanda kurung. Ini meneruskan referensi ke fungsi dan bukan hasil dari fungsi itu. Jika Anda secara tidak sengaja menambahkan tanda kurung untuk dianimasikan di sini, animate akan segera dipanggil (hanya sekali), dan kemungkinan besar Anda akan mendapatkan kesalahan (mungkin sesuatu tentang tuple yang tidak dapat dipanggil)

Jika Anda melihat panggilan ke animate(), Anda akan melihat bahwa panggilan tersebut memiliki 3 parameter yang telah kita tetapkan

animation_7

animation_8 adalah nomor bingkai. Parameter ini diperlukan saat mendefinisikan fungsi untuk animation9. Setiap kali animate()_ dipanggil, animation8 akan secara otomatis bertambah 1. ax2 dan ax3 adalah daftar kami yang masing-masing berisi stempel waktu dan nilai suhu. Kami memberi tahu FuncAnimation() bahwa kami ingin meneruskan ax2 dan ax3 dengan parameter animation0. Tanpa secara eksplisit mengatakan kita ingin ax2 dan ax3 sebagai parameter, kita perlu menggunakan variabel global untuk mengingat nilai dalam ax2 dan ax3

Dalam animate()_, kami mengumpulkan data suhu dan menambahkan stempel waktu, seperti pada contoh sebelumnya. Kami juga memotong ax_2 dan ax3 agar masing-masing dibatasi hingga 20 elemen. Jika kita membiarkan daftar tumbuh tanpa batas waktu, stempel waktu akan sulit dibaca, dan pada akhirnya kita akan menghabiskan memori kita.

Untuk menggambar plot, kita harus menghapus sumbu dengan ani = animation.FuncAnimation(fig, animate, fargs=(xs, ys), interval=1000)5 dan kemudian plot garis dengan ani = animation.FuncAnimation(fig, animate, fargs=(xs, ys), interval=1000)6. Jika kami tidak membersihkannya setiap saat, plot hanya akan digambar di atas satu sama lain, dan keseluruhan grafik akan berantakan. Demikian pula, kita perlu memformat plot untuk setiap frame

Anda mungkin memperhatikan bahwa plot diperbarui hanya sekali per detik (sebagaimana didefinisikan oleh ani = animation.FuncAnimation(fig, animate, fargs=(xs, ys), interval=1000)7). Untuk beberapa sensor, seperti sensor suhu, ini jauh lebih cepat. Faktanya, Anda mungkin hanya ingin mengambil sampel suhu satu kali per menit, jam, atau bahkan setiap hari. Namun, kecepatan pengambilan sampel ini mungkin sepenuhnya terlalu rendah untuk sensor lain, seperti sensor jarak atau akselerometer, di mana aplikasi Anda memerlukan pembaruan setiap beberapa milidetik

Coba turunkan animation_3 menjadi kurang dari 500. Ternyata, menghapus dan menggambar ulang grafik adalah proses yang cukup intensif untuk Pi kecil kami, dan kemungkinan besar Anda tidak akan mendapatkan lebih dari 2 atau 3 pembaruan per detik. Di bagian selanjutnya, kita akan menunjukkan teknik untuk mempercepat laju gambar, tetapi itu berarti mengambil jalan pintas, seperti harus menyetel rentang statis dan tidak menampilkan stempel waktu

Bagaimana Anda memperbarui plot yang sama dalam satu lingkaran dengan Python?

Kita dapat menggunakan matplotlib untuk memplot data langsung dengan Matplotlib. Dengan bantuan matplotlib. plot. draw() function kita dapat mengupdate plot pada gambar yang sama selama loop.

Bagaimana Anda memplot banyak grafik untuk loop?

Pertanyaan lainnya .
Pilih kolom
Buat lingkaran untuk kolom
(Di dalam lingkaran) Tempatkan kolom ini dalam satu seri
(Di dalam lingkaran) Buat sns. petak bar ()
(Di dalam loop) Memanipulasi grafik

Bagaimana Anda memplot subplot dalam satu lingkaran?

sintaksis subplot di dalam loop dan menentukan indeks subplot mana yang harus kita plot datanya . Kami menggunakan fungsi enumerate Python sehingga kami dapat merekam posisi indeks (n) dari daftar saat kami mengulanginya. Kita perlu menambahkan 1 ke angka ini karena enumerate mulai menghitung dari nol, tetapi plt. subplot mulai menghitung pada 1.

Bagaimana cara memperbarui plot secara dinamis dalam satu lingkaran di notebook ipython?

Coba tambahkan show() atau gcf(). tampilkan() setelah fungsi plot() . Ini akan memaksa angka saat ini untuk diperbarui (gcf() mengembalikan referensi untuk angka saat ini).