Membuat animasi plot menggunakan matplotlib

This entry is part 5 of 7 in the series Visualisasi dengan matplotlib

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.

Contoh animasi menggunakan matplotlib funcanimation

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:

  1. Modul matplotlib.plot untuk menggambar plot.
  2. Modul matplotlib.animation untuk menghasilkan animasi dari plot yang ada.
  3. 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.

  1. Argumen num mewakili kali pemanggilan fungsi update, ingat bahwa fungsi update akan dipanggil berulang-ulang dan ia akan menyesuaikan grafik sesuai dengan nilai ini.
  2. Variabel angles adalah array nilai sudut sedangkan sindata adalah array nilai sinus yang telah diinisialisasi diluar fungsi update.
  3. 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.

  1. Argumen fig adalah figure yang sudah disiapkan pada tahap inisialisasi.
  2. Argumen update adalah fungsi update akan dipanggil secara berulang-ulang oleh fungsi ini.
  3. Argumen fargs berisi list dengan nilai yang dibutuhkan oleh fungsi update yakni line (num dilemparkan otomatis)
  4. 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.

Series Navigation<< Membuat histogram dengan matplotlibMembuat grafik fluktuasi nilai tukar US Dollar terhadap Rupiah >>

You may also like...

5 Responses

  1. Arif says:

    Ka mautanya itu ngoding nya di text editor ap ya?… di jupyter notebook bkn?.. maaf masih newbie

  2. syams says:

    saya pake IDE python —> Thonny kog ngga jalan animasinya?

    • Alza says:

      Ada error yang muncul? Biasanya error ada saat mencoba menyimpan file. Sebaiknya menggunakan Jupyter Notebook agar lebih mudah menelusuri akar masalahnya.

Berikan komentar