Matplotlib: Visualisasi dengan Python

Syakura Dhiya
13 min readSep 14, 2023

--

Python adalah salah satu jenis bahasa pemrograman serbaguna yang mendukung berbagai paradigma pemrograman, termasuk pemrograman terstruktur, berorientasi objek, dan fungsional. Dalam penggunaannya, Pythin memiliki beberapa library yang memudahkan penggunanya dalam melakukan pemrograman, salah satunya adalah Matplotlib. Matplotlib ini merupakan plotting library dari program Python untuk membuat visualisasi statis, animasi, dan interaktif dengan Python. Dalam sebuah buku “Essential Python for the Physicist” karya Giovanni Moruzzi yang akan saya ulas di sini, ada beberapa hal yang perlu diperhatikan terkait Plotting with Matplotlib.

Tentang Pyplot

Dalam menunjang kerjanya, Matplotlib ini dibantu dengan sebuah kumpulan fungsi, salah satunya pyplot. Pyplot ini merupakan sebuah fungsi yang membuat Matplotlib dapat bekerja seperti MATLAB. Setiap fungsi pyplot membuat beberapa perubahan pada sebuah gambar, seperti membuat area plot pada sebuah grafik, memplot garis-garis pada area plot, dan menambahkan label (teks) pada plot itu sendiri atau ke sumbu horizontal dan vertikal grafik. Grafik yang lengkap bisa didapat dengan langkah berurutan dalam pemanggilan fungsi pyplot tanpa mengubah fungsi sebelumnya.

Plotting Daftar Bilangan

Untuk lebih jelasnya, sebagai contoh, akan diplot sebuah daftar bilangan [1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0] dalam bentuk grafik dengan menulis kode pemrograman pada Python seperti berikut.

Listing 1. Plotting Daftar Bilangan
1 # !/ usr/ bin/env python3
2 import matplotlib. pyplot as plt
3 #
4 plt . plot([1.0,2.0,4.0,8.0,16.0,32.0,64.0])
5 plt .show( )

Dari kode program tersebut, baris 2 dimaksudkan untuk mengimpor matplotlib.pyplot sebagai plt dan baris 4 untuk memanggil fungsi plot () sehingga dapat menghasilkan polyline seperti grafik pada Gambar 1 di bawah. Namun, perlu diperhatikan bahwa apabila diberikan sebuah daftar angka tunggal atau array, Matplotlib akan mengasumsikan bahwa daftar tersebut adalah komponen ordinat (y), sedangkan absis (x) akan disesuaikan secara otomatis. Daftar nilai x defaultnya sendiri memiliki panjang yang sama dengan daftar nilai y, dan terdiri dari bilangan-bilangan asli yang berurutan mulai dari 0.

Gambar 1. Hasil grafik untuk plotting daftar bilangan

Pada grafik di atas, plot yang dihasilkan memiliki fungsi y = 2^x. Namun, secara umum, plotting daftar bilangan dapat dilakukan dengan memberikan plot pada dua daftar angka dengan panjang yang sama, daftar pertama akan dianggap sebagai absis (x) dan yang kedua sebagai ordinat. Grafik yang terbentuk pun akan diskalakan secara otomatis sesuai dengan nilai x dan y yang dimasukkan. Grafik ini juga dapat diberikan format tambahan yang menunjukkan warna dan bentuk garis dari grafik karena secara default, grafik yang dibentuk Matplotlib akan menghasilkan warna biru dengan bentuk garis (b-). Untuk itu, dapat digunakan fungsi string seperti pada contoh kode di bawah untuk menghasilkan grafik dengan bentuk dan warna yang lain.

Listing 2. Plotting daftar bilangan dengan grafik merah
1 # !/ usr/ bin/env python3
2 import matplotlib. pyplot as plt
3 #
4 plt . plot ([3.0,4.0,5.0,6.0,7.0,8.0],[8.0,16.0,32.0,64.0,128.0,256.0], ’ro ’)
5 plt .show( )

String ‘ro’ pada baris 4 menyatakan bahwa Matplotlib meminta plot yang dihasilkan berwarna merah (r) dan berbentuk lingkaran (o) sehingga dihasilkan grafik seperti pada Gambar 2 di bawah.

Gambar 2. Hasil plotting grafik dengan string ‘ro’

Selain dengan menuliskan daftar angka satu persatu, pada Matplotlib juga dapat digunakan fungsi numpy array untuk memudahkan pekerjaan. Berikut contoh kode program dengan numpy array yang memplot tiga garis berbeda dengan format yang berbeda.

Listing 3. Plotiing grafik dengan numpy array
1 # !/ usr/ bin/env python3
2 import matplotlib. pyplot as plt
3 import numpy as np
4 #
5 x=np. arange (0.0 ,2.0 ,0.05)
6 plt . plot (x,x,x,np. sqrt (x) , ’ro ’ ,x,x∗∗2, ’g^ ’ )
7 plt .show( )

Pada kode tersebut, baris 5 dimaksudkan untuk membuat array x yang terdiri dari 40 elemen (0.0, 0.05, 0.1,…, 1.95). Baris 6 dimaksudkan untuk membuat grafik dengan 3 fungsi berbeda, yang mana perintah pertama untuk memplot array y = x terhadap x sehingga menghasilkan sebuah garis linear dengan format default, perintah kedua untuk memplot y = √x dengan string format ‘ro’, dan perintah ketiga untuk memplot y = x² terhadap x dengan string format ‘g^’ yang berarti grafik berbentuk segitiga berwarna hijau. Dengan begitu, kode ini pun akan menghasilkan grafik seperti pada Gambar 3 berikut.

Gambar 3. Hasil plotting grafik dengan numpy array untuk 3 fungsi berbeda

Plotting Fungsi

Dengan Matplotlib ini dapat dilakukan plotting dengan banyak fungsi, seperti numpy, spicy, bahkan fungsi yang didefinisikan sendiri oleh pengguna. Berikut salah satu contoh kode program untuk plotting fungsi kurva sinus.

Listing 4. Plotting fungsi untuk kurva sinus
1 # !/ usr/ bin/env python3
2 import numpy as np
3 import matplotlib. pyplot as plt
4 #
5 x = np. arange (0 ,6.4 ,0.1);
6 y = np. sin (x)
7 plt . plot(x, y)
8 plt .show( )

Plotting fungsi tersebut dilakukan dengan memasukkan sampel koordinat x dan y ke dalam dua array numpy (baris 5 dan 6) untuk dibuat menjadi sebuah plot y terhadap x (baris 7) sehingga menghasilkan kurva seperti pada Gambar 4 berikut.

Gambar 4. Hasil plotting fungsi untuk kurva sinus

Kurva tersebut dapat dimodifikasi dan disempurkan dengan menggunakan fungsi pyplot sehingga dihasilkan grafik yang lebih lengkap dan informatif.

Listing 5 Modifikasi plotting fungsi dengan pyplot
1 # !/ usr/ bin/env python3
2 import numpy as np
3 import matplotlib. pyplot as plt
4 #
5 x = np. arange (0 ,6.4 ,0.1);
6 y = np. sin (x)
7 plt . plot(x, y)
8 plt . grid (True)
9 plt . xticks ( fontsize=14)
10 plt . yticks ( fontsize=14)
11 plt . ylabel ( r ’$\ sin (x)$’ , fontsize=24)
12 plt . xlabel ( r ’$x/{\rm rad}$’ , fontsize=24)
13 plt . tight_layout ( )
14 plt . savefig ( ’SineGrid. eps ’ , format=’eps ’ ,\
15 dpi=1000)
16 plt .show( )

Pada kode tersebut, baris 8 digunakan untuk menambahkan grid pada grafik, baris 9 dan 10 untuk mengubah ukuran font default dari skala x dan y, baris 11 dan 12 untuk menambahkan label untuk sumbu x dan y, baris 13 untuk menyesuaikan tata letak gambar, dan baris 14–15 untuk menentukan format gambar yang diinginkan. Dengan pengaturan tersebut, maka akan dihasilkan grafik seperti pada Gambar 5 di bawah.

Gambar 5. Hasil modifikasi plotting fungsi dengan pyplot

Multiple Figure/Subplot

Satu skrip Python dapat digunakan untuk menghasilkan gambar dengan lebih dari satu grafik (subplot) terpisah. Berikut contoh kode programnya dengan Matplotlib.

Listing 3.6 SubPlots.py
1 # !/ usr/ bin/env python3
2 import matplotlib. pyplot as plt
3 import numpy as np
4
5 def fun1(t ,omega, tau ,ampl):
6 y=ampl∗np. cos (omega∗t )∗np.exp(−t /tau)
7 return y
8 def fun2(t ,omega,omega2,ampl):
9 y=ampl∗np. sin (omega2∗t )∗np. sin (omega∗t )
10 return y
11 #
12 omega=32.0
13 omega2=np. pi/2.0
14 tau=1.0
15 ampl=5.0
16 ampl2=10.0
17 t=np. arange (0.0 , 2.0, 0.01)
18 s1=fun1(t ,omega, tau ,ampl)
19 s2=fun2(t ,omega,omega2,ampl2)
20 # ........................................
21 plt . figure ( figsize =(10,4))
22 # ................................... subplot 1
23 plt . subplot (1,2,1)
24 plt . plot (t , s1)
25 plt . plot (t ,ampl∗np.exp(−t /tau ))
26 plt . grid (True)
27 plt . xticks ( fontsize=14)
28 plt . yticks ( fontsize=14)
29 plt . ylabel ( r ’$A\ ,\ cos (\omega t )\ ,{\rm e}^{−t /\ tau}$’ , fontsize=24)
30 plt . xlabel ( r ’$t$ ’ , fontsize=24)
31 plt . tight_layout ( )
32 # ................................... subplot 2
33 plt . subplot (1,2,2)
34 plt . plot (t , s2)
35 plt . plot (t ,ampl2∗np. sin (omega2∗t ))
36 plt . grid (True)
37 plt . xticks ( fontsize=14)
38 plt . yticks ( fontsize=14)
39 plt . ylabel ( r ’$B\ ,\ sin (\omega t )\ ,\ sin (\omega_2 t )$’ , fontsize=24)
40 plt . xlabel ( r ’$t$ ’ , fontsize=24)
41 plt . tight_layout ( )
42 #
43 plt . savefig ( ’MultiPlot0 . eps ’ , format=’eps ’ , dpi=1000)
44 plt .show( )

Pada kode tersebut, baris 5–7 dan 8–10 digunakan untuk mendefinisikan dua fungsi yang ingin diplot, masing-masing dalam bentuk matematis. Kedua fungsi tersebut akan diplot ke dalam 2 subplot terpisah. Kemudian, baris 12–16 digunakan untuk memberikan nilai pada parameter kedua fungsi. Baris 17–19 digunakan untuk membuat array untuk parameter kedua fungsi dan baris 21 untuk membuat gambar dengan ukuran yang diinginkan. Lalu, baris 22–31 digunakan untuk membuat subplot fungsi 1, baris 32–42 digunakan untuk membuat subplot fungsi 2, dan baris 43–44 untuk menampilkan kedua bentuk grafik pada Gambar 6 berikut.

Gambar 6. Hasil plotting 2 subplot dengan 2 fungsi berbeda

Skala Sumbu Logaritma

Fungsi pyplot pada Matplotlib tidak hanya dapat digunakan untuk skala linear saja, tetapi juga skala logaritma dan logit untuk data dengan rentang nilai yang sangat besar. Berikut contoh kode program untuk membuat plot dengan skala logaritma.

Listing 7. Plotting grafik Log
1 # !/ usr/ bin/env python3
2 import matplotlib. pyplot as plt
3 import numpy as np
4 # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . functions
5 x=np. arange (1.0 ,20.5 ,1.0)
6 y1=x∗∗2
7 y2=np. sqrt (x)
8 # ........................................
9 plt . figure ( figsize=(10,8))
10 # ................................... subplot 1
11 plt . subplot (2,2,1)
12 plt . plot (x,y1, ’ro ’ )
13 plt . plot (x,y2, ’bo’ )
14 plt . grid (True)
15 plt . xticks ( fontsize=14)
16 plt . yticks ( fontsize=14)
17 plt . xlabel ( ’linear ’ , fontsize=16)
18 plt . ylabel ( ’linear ’ , fontsize=16)
19 plt . tight_layout ( )
20 plt . ylim(−10,420)
21 plt . xlim(0,21)
22 # ................................... subplot 2
23 plt . subplot (2,2,2)
24 plt . plot (x,y1, ’ro ’ )
25 plt . plot (x,y2, ’bo’ )
26 plt . grid (True)
27 plt . yscale ( ’log ’ )
28 plt . xticks ( fontsize=14)
29 plt . yticks ( fontsize=14)
30 plt . xlabel ( ’linear ’ , fontsize=16)
31 plt . ylabel ( r ’$\log$ ’ , fontsize=20)
32 plt . tight_layout ( )
33 plt . ylim(0.8,500)
34 plt . xlim(−0.8,21)
35 # ................................... subplot 3
36 plt . subplot (2,2,3)
37 plt . plot (x,y1, ’ro ’ )
38 plt . plot (x,y2, ’bo’ )
39 plt . grid (True)
40 plt . xscale ( ’log ’ )
41 plt . xticks ( fontsize=14)
42 plt . yticks ( fontsize=14)
43 plt . xlabel ( r ’$\log$ ’ , fontsize=20)
44 plt . ylabel ( ’linear ’ , fontsize=16)
45 plt . tight_layout ( )
46 plt . ylim(−10.8,420)
47 plt . xlim(0.8,22)
48 # ................................... subplot 4
49 plt . subplot (2,2,4)
50 plt . plot (x,y1, ’ro ’ )
51 plt . plot (x,y2, ’bo’ )
52 plt . grid (True)
53 plt . xscale ( ’log ’ )
54 plt . yscale ( ’log ’ )
55 plt . xticks ( fontsize=14)
56 plt . yticks ( fontsize=14)
57 plt . xlabel ( r ’$\log$ ’ , fontsize=20)
58 plt . ylabel ( r ’$\log$ ’ , fontsize=20)
59 plt . tight_layout ( )
60 plt . ylim(0.8,500)
61 plt . xlim(0.8,25)
62 #
63 plt . savefig ( ’LogPlot0. eps ’ , format=’eps ’ , dpi=1000)
64 plt .show( )

Pada kode tersebut, baris 5 digunakan untuk membuat array nilai x, baris 6–7 untuk membuat array nilai y1 dan y2 dengan dua fungsi berbeda, dan baris 9 untuk mengatur ukuran grafik yang diinginkan. Baris 10–21 digunakan untuk membuat dan mengatur subplot 1, baris 22–34 untuk subplot 2, baris 35–47 untuk subplot 3, dan baris 48–61 untuk subplot 4.

Lebih detailnya, Baris 20–21, 33–34, 46–47, dan 60–61 pada setiap subplot digunakan untuk mengatur nilai batas x dan y agar lebih besar dari nilai aslinya.

Sementara itu, untuk baris 27 pada subplot 2 sendiri digunakan membuat skala y menjadi logaritmik sehingga plot akar kuadrat tidak lagi datar. Untuk skala logartitmik ini, niali koordinat nol dan negatif harus dihindari, tetapi jika membutuhkan nilai negatif, maka baris 27 tersebut dapat diganti dengan ‘plt.yscale(symlog)’, yang mana ‘symlog’ di sini merupakan logaritma simetris yang fungsinya didefinisikan sebagai

Ini berarti fungsi dalam rentang -ythr ≤ y ≤ ythr adalah linear, yang mana secara default, ythr ini bernilai 2. Namun, nilai ythr ini dapat diubah sesuai yang dinginkan, misalnya 0.1 sehingga kode pada baris 27 menjadi seperti berikut.

27 plt . yscale ( ’symlog’ ,linthreshy =0.1)

Lalu, baris 40 pada subplot 3 digunakan untuk membuat skala x menjadi logaritma dengan skala y adalah linear. Dan untuk x yang bernilai nol atau negatif, fungsi log juga dapat diganti dengan symlog seperti pada baris 27 sehingga dibuat kode seperti berikut

40. plt.xscale(’symlog’,linthreshx=MyValue)

Dan baris 53 dan 54 pada subplot 4 digunakan untuk membuat skala kedua sumbunya (x dan y) logaritmik dengan lingkaran yang mewakili kedua set data terletak pada garis lurus.

Lalu, dengan menggunakan baris 63–64 untuk menampilkan grafik dapat dilihat hasil dari keempat subplot seperti pada Gambar 7 berikut.

Gambar 7. Hasil plotting grafik skala logaritma dengan 4 subplot berbeda

Plotting Garis Medan

Matplotlib ini juga dapat digunakan untuk memplot garis medan, khususnya garis medan dipol listrik yang terdiri dari dua muatan +q dan -q dengan letak masing-masing pada (0, +h) dan (0, -h) dalam grafik kartesian seperti pada Gambar 8 berikut.

Gambar 8. Ilustrasi garis medan listrik dua muatan

Untuk mambuat garis medan tersebut pada Python, maka dapat digunakan kode program seperti contoh berikut.

Listing 3.8 PlotDipoleField.py
1 # !/ usr/ bin/env python3
2 import matplotlib. pyplot as plt
3 import numpy as np
4 # . . . . . . . . . . . . . . . . . . . . . charge locations
5 yplus=1.0
6 yminus=−1.0
7 xplus=xminus=0.0
8 rad=0.1
9 lim=30
10 nLin=60
11 plt . axis ( ’ off ’ )

Pada kode tersebut, baris 5–11 dimaksudkan untuk mengatur lokasi muatan, yang mana xplus — xminus dan yplus — yminus (baris 5–7) mewakili titik koordinat x dan y dari muatandipol positif — negatif. Sementara itu, rad (baris 8) mewakili nilai jari-jari lingkaran di sekitar muatan positif +q (awal mulai garis medan). Kemudian, lim (baris 9 ) sendiri dimakasudkan untuk mengatur nilai batas garis medan dan nLin (baris 10) merupakan jumlah n garis medan yang dimulai dari muatan positif. Lalu, baris 11 digunakan untuk menghilangkan sumbu-sumbu dari gambar.

12 # . . . . . . . . . . . . . . . . . . . . . field lines
13 i=0
14 delta=0.05

Baris 13–14 ini dimaksudkan untuk membuat garis medan, yang mana variabel i mewakili garis medan dan delta merupakan beda dari setiap segemen garis.

15 while i<nLin:
16 xli st =[]
17 yli st =[]
18 alpha0=i∗2∗np. pi / float (nLin)
19 x=xplus+rad∗np. cos (alpha0 )
20 y=yplus+rad∗np. sin (alpha0 )
21 xli st .append(x)
22 yli st .append(y)
23 while True:
24 alpha=np. arctan2 ( (y−yplus ) ,(x−xplus ))
25 beta=np. arctan2 ( (y−yminus) , (x−xminus) )
26 Eplus=1.0/((x−xplus)∗∗2+(y−yplus)∗∗2)
27 Eminus=−1.0/((x−xminus)∗∗2+(y−yminus)∗∗2)
28 Ex=Eplus∗np. cos (alpha)+Eminus∗np. cos ( beta )
29 Ey=Eplus∗np. sin (alpha)+Eminus∗np. sin ( beta )
30 gamma=np. arctan2 (Ey,Ex)
31 x=x+delta∗np. cos (gamma)
32 y=y+delta∗np. sin (gamma)
33 i f x>lim or x<−lim or y>lim or y<0:
34 break
35 xli st .append(x)
36 yli st .append(y)
37 plt . plot ( xlist , ylist , ’k−’ ,linewidth=0.5)
38 yli st=−np. array ( yli st )
39 plt . plot ( xlist , ylist , ’k−’ ,linewidth=0.5)
40 i+=1
41 # ........................................................
42 plt . savefig ( ’DipoleField . pdf ’ , format=’pdf ’ )
43 plt .show( )

Lalu, baris 15–40 ini mengambarkan satu garis medan pada setiap iterasi sehingga didapatkan hasil plot garis medan sebagai berikut.

Gambar 9. Hasil plotting untuk garis medan

Animasi Pyplot

Selain grafik, Matplotlib juga dapat digunakan untuk membuat sebuah animasi, yang mana caranya adalah dengan menggunakan dua fungsi berikut, yaitu FuncAnimation (membuat animasi dengan menggunakan fungsi func()) dan ArtistAnimation (membuat animasi dengan menggunakan set tetap objek artist).

Namun, pada kali ini yang akan dibahas hanya fungsi FuncAnimation saja yang lebih sering digunakan oleh fisikawan. Sebagai contoh penggunaannya adalah menampilkan animasi dari kurva sinus yang teredam secara eksponensial dengan kode program sebagai berikut.

Listing 9. Animasi pyplot
1 # !/ usr/ bin/env python3
2 #
3 import numpy as np
4 import matplotlib. pyplot as plt
5 import matplotlib .animation as animation
6 #
7 fig ,ax=plt . subplots ( figsize =(10,6))
8 ax. set (ylim=(−1,1))
9 #

Baris 7 dimaksudkan untuk mengatur ukuran gambar yang diinginkan dengan satu subplot ax. Baris 8 digunakan untuk menetapkan batas sumbu y dari subplot.

10 def func(x):
11 return np. sin(8∗x)∗np.exp(−0.1∗x)
12 #
13 x=np. arange(0,10,0.01)
14 line ,=ax. plot (x, func (x) )

Baris 10–11 untuk mendefinisikan fungsi func(x) sinus. Baris 13 untuk membuat array dari nilai x. Baris 14 untuk membuat garis objek dengan x sebagai xdata dan func(x) sebagai ydata.

16 def animate( i ):
17 xx=x+i/100
18 line . set_xdata (xx)
19 line . set_ydata ( func (xx) )
20 ax. set (xlim=(xx[0] ,xx[999]))
21 return line ,
22 #

Baris 16–21 ini mendefinisikan fungsi animate() untuk memperbarui plot pada setiap “frame” animasi. Fungsi ini memiliki argumen tunggal i, yang akan bertambah 1 pada setiap langkah animasi. Baris 17 untuk membuat array xx yang setiap nilainya diperoleh dari nilai yang sesuai dengan nilai pada array x dengan menambahkan i/100 pada masing-masing x. Baris 18 dan 19 digunakan untuk memperbarui nilai x dan y dari garis objek. Baris 20 untuk memperbarui batas sumbu x plot dan baris 21 untuk mengulangi perintah line hingga seluruh nilai xx terpenuhi.

23 ani=animation .FuncAnimation( fig , animate , interval=20)
24 plt .show( )

Pada baris 23, fungsi FuncAnimation digunakan untuk membuat plot animasi dengan memanggil fungsi animate berulang kali. Elemen fig pada FuncAnimation() dimaksudkan untuk gambar yang akan digambar, elemen animate merupakan fungsi pembaruan, dan interval (opsional) dimaksudkan untuk menunda waktu tampilan antara frame yang berurutan (dalam milisecond). Untuk interval sendiri memiliki nilai default sebesar 200 ms, tetapi pada kode ini digunakan interval 20 ms.

Kemudian, animasi ditampilkan dengan fungsi pada baris 24 sehingga menghasilkan animasi seperti pada Gambar 10 berikut.

Gambar 10. Hasil animasi pyplot untuk kurva sinus teredam

Saat dilakukan pengamatan, hasil dari animasi kurava sinus teredam ini akan bergerak ke arah kiri. Pergerakan animasi ini pun dapat direkan ke dalam video .mp4 dengan memasukkan kode ‘ani.save(’test.mp4’, fps=30)’ di antara baris 23 dan 24 sehingga kode program menjadi seperti berikut, yang mana elemen pertama pada fungsi ani.save() tersebut mewakili penamaan file dari hasil rekaman mp4.

23 ani=animation .FuncAnimation( fig , animate , interval=20)
24 ani.save('test.mp4', fps=30)
25 plt .show( )

Demikian ringkasan terkait “Chapter3: Plotting with Matplotlib” dari buku karya Giovanni Moruzzi, Essential Python for the Physicist. Semoga apa yang saya tulis dapat bermanfaat bagi para pembaca.

--

--

Syakura Dhiya
Syakura Dhiya

No responses yet