Membuat animasi plot menggunakan matplotlib
- Visualisasi diagram venn dua himpunan dengan matplotlib
- Visualisasi diagram venn tiga himpunan dengan matplotlib
- Menggambar gelombang trigonometri dengan matplotlib dan numpy
- Membuat histogram dengan matplotlib
- Membuat animasi plot menggunakan matplotlib
- Membuat grafik fluktuasi nilai tukar US Dollar terhadap Rupiah
- Membuat grafik fluktuasi nilai USD terhadap mata uang ASEAN
Pada artikel sebelumnya sudah ditunjukkan cara membuat plot grafik fungsi trigonometri menggunakan matplotlib (lihat artikel). Kali ini akan dicontohkan cara untuk membuat plot yang ada, ditampilkan bergiliran titik demi titik sehingga terlihat sebagai animasi.
Animasi dapat dihasilkan dengan memanfaatkan modul matplotlib.animation. Pada artikel ini akan dicontohkan cara membuat animasi gelombang sinus dari sudut 0 s.d 3pi radian.
Modul yang dibutuhkan
Langkah pertama adalah melakukan import beberapa modul yang kita butuhkan antara lain:
- Modul matplotlib.plot untuk menggambar plot.
- Modul matplotlib.animation untuk menghasilkan animasi dari plot yang ada.
- Modul numpy untuk beberapa fungsi yang akan kita gunakan terutama untuk menghitung nilai sinusnya.
import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np
Menyiapkan nilai pada plot
Langkah berikutnya adalah menyiapkan nilai pada sumbu x (sudut) dan nilai pada sumbu y (nilai sinus). Untuk nilai sudut disiapkan menggunakan numpy.arange mulai dari sudut 0 radian sampai sudut 3 kali pi (3.14) radian atau setara dengan 540 derajat, dengan interval sebesar 0.1, sedangkan nilai sinusnya dapat menggunakan fungsi np.sin().
angles = np.arange(0, 3*np.pi, 0.1) # siapkan nilai sudut sindata = np.sin(angles) # siapkan nilai sinus sudutnya
Inisialisasi plot
Selanjutnya adalah inisialisasi plot. Plot awalnya disiapkan menggunakan grafik tanpa data dengan sumbu x mulai dari 0 s.d 3 pi radian, sedangkan sumbu y dari -1 s.d 1 (minimum dan maksimum dari fungsi sinusnya). Grafik kemudian dikasi keterangan berupa judul grafik dan sumbu.
fig, ax = plt.subplots() # inisialisasi figure dan axes/sumbu line, = ax.plot([], [], color='g') # plot dengan data kosong warna g (green) line.axes.axis([0, 3 * np.pi, -1, 1]) # atur sumbu x dari 0 s.d 3pi, y dr -1 s.d 1 plt.title('Animasi gelombang sinus') # judul grafik plt.xlabel('Sudut (radian)') # judul sumbu x plt.ylabel('Sinus') # judul sumbu y plt.grid(True, which='both') # tampilkan grid/kotak-kotak
Fungsi update
Untuk menghasilkan animasi, kita menggunakan sebuah fungsi yang dapat menghasilkan visualisasi plot yang berubah setiap ia dipanggil. Plot akan ditampilkan mulai dari nilai sudut paling awal (0), kemudian secara bertahap hingga nilai sudut terakhir (3pi) sehingga menghasilkan animasi seolah-olah grafiknya bergerak tumbuh dari kiri ke kanan. Pada contoh fungsi diberi nama update() dengan kode sebagai berikut.
def update(num, line): line.set_data(angles[:num], sindata[:num]) return line,
Penjelasan variabel pada fungsi update.
- Argumen num mewakili kali pemanggilan fungsi update, ingat bahwa fungsi update akan dipanggil berulang-ulang dan ia akan menyesuaikan grafik sesuai dengan nilai ini.
- Variabel angles adalah array nilai sudut sedangkan sindata adalah array nilai sinus yang telah diinisialisasi diluar fungsi update.
- Argumen line mewakili garis/plot pada grafik yang digambar ulang tiap pemanggilan fungsi update oleh FuncAnimation (lihat di bawah).
Di dalam fungsi dilakukan pemanggilan line.set_data dengan nilai array pada angles (sudut) dan nilai sinusnya (sindata). Yang perlu diperhatikan adalah adanya notasi :num yang berarti bahwa nilai yang diambil adalah dari awal array sampai indeks yang lebih kecil dari nilai num ( lihat artikel mengenai slicing untuk memahami notasi ini)
FuncAnimation
Langkah berikutnya adalah menghasilkan animasi menggunakan fungsi FuncAnimation
ani = animation.FuncAnimation(fig, update, fargs=[line],interval=10)
Fungsi ini menerima beberapa argumen dengan penjelasan sebagai berikut.
- Argumen fig adalah figure yang sudah disiapkan pada tahap inisialisasi.
- Argumen update adalah fungsi update akan dipanggil secara berulang-ulang oleh fungsi ini.
- Argumen fargs berisi list dengan nilai yang dibutuhkan oleh fungsi update yakni line (num dilemparkan otomatis)
- Argumen interval yakni waktu jeda antar frame dengan default nilai 200ms.
Kode lengkap
Berikut adalah seluruh kode untuk menghasilkan animasi seperti pada awal artikel dalam format gif. Direkomendasikan menggunakan jupyter notebook.
%matplotlib notebook import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np angles = np.arange(0, 3*np.pi, 0.1) # siapkan nilai utk sumbu x sindata = np.sin(angles) # siapkan nilai utk sumbu y fig, ax = plt.subplots() line, = ax.plot([], [], color='g') ax.axis([0, 3 * np.pi, -1, 1]) # atur rentang nilai sumbu x dan y plt.title('Animasi gelombang sinus') # judul grafik plt.xlabel('Sudut (radian)') # judul sumbu x plt.ylabel('Sinus') # judul sumbu y plt.grid(True, which='both') # tampilkan grid/kotak-kotak def update(num, line): line.set_data(angles[:num], sindata[:num]) return line, ani = animation.FuncAnimation(fig, update, fargs=[line],interval=10) ani.save('anim/sine.gif', writer='imagemagick', fps=30)
Animasi dua plot sekaligus
Kode di bawah adalah contoh animasi dua plot sekaligus yakni sinus dan cosinus. Perhatikan bedanya dengan contoh sebelumnya terutama pada fungsi update dan FuncAnimation.
%matplotlib notebook import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np angles = np.arange(0, 3*np.pi, 0.1) # prepare axis data sindata = np.sin(angles) cosdata = np.cos(angles) fig, ax = plt.subplots() line1, = ax.plot([], [], color='g') line2, = ax.plot([], [], color='r') ax.axis([0, 3 * np.pi, -1, 1]) # siapkan rentang sumbu x dan y plt.title('Animasi gelombang sinus dan cosinus\n') # judul grafik plt.xlabel('Sudut (radian)') # judul sumbu x plt.ylabel('Sinus') # judul sumbu y plt.grid(True, which='both') # tampilkan grid/kotak-kotak def update(num, line1, line2): line1.set_data(angles[:num], sindata[:num]) line2.set_data(angles[:num], cosdata[:num]) return line1,line2 ani = animation.FuncAnimation(fig, update, fargs=[line1,line2],interval=10) ani.save('gifs/sinecos.gif', writer='imagemagick', fps=30)
Hasil
Sekian, semoga bermanfaat.
Ka mautanya itu ngoding nya di text editor ap ya?… di jupyter notebook bkn?.. maaf masih newbie
Ya, saya pakai jupyter notebook karena animasinya langsung terlihat di tempat yang sama.
https://github.com/ewinsutriandi/jupyter-notebook-ws/blob/master/animations/Trigonometry%20-%20Sine%20Plot%20Animation.ipynb <– kodenya
saya pake IDE python —> Thonny kog ngga jalan animasinya?
Ada error yang muncul? Biasanya error ada saat mencoba menyimpan file. Sebaiknya menggunakan Jupyter Notebook agar lebih mudah menelusuri akar masalahnya.