1. Home
  2. Docs
  3. Kelas Privat Python – 01
  4. Materi [Basic Library]
  5. Pengenalan Matplotlib

Pengenalan Matplotlib

Manusia adalah makhluk visual. kita dapat lebih mudah memahami sesuatu lebih baik dengan visualisasi. kita dapat lebih mudah menemukan pola-pola yang mungkin tersembunyi apa bila kita bisa melihatnya secara visual.

Pada artikel ini kita akan membahas suatu topik tentang Visualisasi menggunakan liblary matplotlib. kita akan belajar bagaimana caranya membuat objek visual yang informatif dan menarik.

Matplotlib adalah suatu liblary yang low-level untuk membangun objek visual. maksudnya low-level bukan jelek ya. tapi low-level ini memberikan kita control sampai ke komponen-komponen kecilnya. kalau misalkan kita buat mobil, kita mengontrol sampai pembuatan ke baut bautnya. Oleh karena itu matplotlib penting di fahami sebagai dasar apabila ingin mendalami bidang visualisasi data.

Install Liblary Matplotlib

Untuk dapat menggunakan liblary matplotlib, install terlebih dahulu liblary tersebut dengan:

pip install matplotlib

Komponen Besar: Figure dan Axes

Kita akan membahas top-level component, yaitu komponen terbesar dalam suatu objek visualisasi, Figure dan Axes.

Sebelum dijelaskan lebih jauh lagi, mari lihat terlebih dahulu seperti apa contoh sederhana visualisasi data.

import random
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y = [random.random()*100 for i in range(100)]

plt.figure(figsize=(12, 8))
plt.plot(x, y)
plt.show()

Ok, sampai sini setidaknya kalian mempunyai gambaran besar tentang objek visual data. Kita akan lanjut bahas tentang komponen terbesar dalam objek visual ini.

Figure, adalah window atau page atau halaman dalam objek visual. kalau kita ngegambar di kertas, maka kertas tersebutlah yang di namakan figure.

Axis, kedalam Figure kita menambahkan Axis, Axis adalah suatu area di dalam figure dimana data akan di plot. Dalam Axis juga terdapat berbagai macam komponen lagi seperti x-axis, y-axis, dan lain sebagainya. hal ini akan kalian lihat di artikel ke dua.

Selain Figure dan Axis, ada komponen lain dalam visualisasi, yaitu Artist. Artist adalah komponen yang digunakan untuk memperindah objek visualisasi kita, seperti legend, title, tick labels dan lainnya. Topik tentang Artist ini akan dibahas di pertemuan ke dua ya .. ^_^

Setelah memahami komponen terbesar dari matplotlib, berikut akan di tunjukan beberapa macam perintah kode untuk membuat komponen-komponen tersebut dan memberiakan data kepada komponen Axis.

Beikut adalah method untuk membuat figure:

import matplotlib.pyplot as plt

fig = plt.figure()
print(fig)
===========
<Figure size 432x288 with 0 Axes>

Perhatikan kita mempunyai objek Figure dengan 0 Axis. sekarang kita akan menambahkan axis kedalam objek figure kita dengan method add_subplot(). kemudian kita tunjukan objek figure kita dengan method show().

# membuat objek figure
fig = plt.figure()

# membuat objek axes
ax = fig.add_subplot()

# menampilkan objek visual
plt.show()

Sekarang kita akan tambahkan data kedalam objek tersebut dengan memanggil method plot() dan memberikan data sebagai argument method tersebut:

# membuat objek figure
fig = plt.figure()

# membuat objek axes
ax = fig.add_subplot()

# membuat data
data_x = [1, 2, 3, 4, 5]
data_y = [10, 20, 25, 30, 15]

# menambahkan dalam ke objek axes
ax.plot(data_x, data_y)

# menampilkan data
plt.show()

Begitulah cara sederhana untuk membuat objek visualisasi, sekarang akan di tunjukan cara lain yang lebih clean.

# membuat objek visual
plt.plot(data_x, data_y)

# menampilkan objek visual
plt.show()

Perhatikan, kedua cara tadi menghasilkan hasil yang sama. tapi cara kedua lebih clean karena tidak memerlukan banyak kode. sebenarnya ke dua cara tersebut sama-sama menghasilkan komponen Figure dan Axis. tetapi cara pertama Explicit sedangkan cara kedua Implicit.

Cara yang Explicit di rekomendasikan ketika kita ingin membuat visualisasi data yang lebih kompleks. karena kita dapat mengontrol berbagai macam komponen yang terdapat di dalam objek figure dan axes, saat ini kalian belum banyak melihat komponen tersebut, materi ini akan diberikan di materi ke 2.

Namun, kita juga dapat membuat cara visualisasi data lebih simple dengan menggabungkan pembuatan objek Figure dan Axes dengan sekali jalan, melalui pemanggilan method subplots(), seperti ini:

# membuat objek figure dan axes
fig, ax = plt.subplots()

# membuat data
data_x = [1, 2, 3, 4, 5]
data_y = [10, 20, 25, 30, 15]

# menambahkan dalam ke objek axes
ax.plot(data_x, data_y)

# menampilkan data
plt.show()

Memungkinkan untuk memplot lebih dari satu data kedalam suatu axis dengan cara seperti ini:

fig, ax = plt.subplots()
data_x1 = [1, 2, 3, 4]
data_y1 = [10, 20, 25, 30]
data_x2 = [1, 2, 3, 4, 5]
data_y2 = [5, 15, 20, 25, 30]
ax.plot(data_x1, data_y1)
ax.plot(data_x2, data_y2)
plt.show()

Menyimpan dan menampilkan gambar hasil plotting

Setelah kita melakukan plotting data, kita bisa melakukan penyimpanan dan menampilkan data yang kita simpan menggunakan modul Image, seperti berikut:

#membuat figure dan axis
fig, ax = plt.subplots()
data_x1 = [1, 2, 3, 4, 5]
data_y1 = [10, 20, 25, 30, 35]
data_x2 = [1, 2, 3, 4, 5]
data_y2 = [5, 15, 20, 25, 30]
ax.plot(data_x1, data_y1)
ax.plot(data_x2, data_y2)
plt.show()

#menyimpan hasil figure
fig.savefig('coba.png')

#menampilkan figure yang disimpan
from IPython.display import Image
Image('coba.png')

Visualisasi Kustom

Berikut adalah raw objek visualisasi data yang akan kita custom:

import matplotlib.pyplot as plt

# membuat component figure dan axis
fig, ax = plt.subplots()

data_x = [1, 2, 3, 4, 5, 6, 7]
data_y = [10, 20, 25, 30, 15, 18, 10]

# memberikan data kedalam axis
ax.plot(data_x, data_y)
plt.show()

Custom LineStyle

Garis penghubung antara data poin dapat di ubah dengan memberikan argument linestyle terhadap method plot, perhatikan contoh code berikut:

import matplotlib.pyplot as plt

# membuat component figure dan axis
fig, ax = plt.subplots()

data_x = [1, 2, 3, 4, 5, 6, 7]
data_y = [10, 20, 25, 30, 15, 18, 10]

# memberikan data kedalam axis
ax.plot(data_x, data_y, marker='x', linestyle='--')
plt.show()

Di atas di berikan nilai ‘–‘ terhadap argument linestyle, terdapat berbagai opsi untuk memberikan berbagai jenis bentuk terhdap linestyle, yaitu sebagai berikut :

Memilih Warna

Dapat di pilih warna plot dengan memberikan argument color terhadap method plot.

Memilih value untuk argument color bisa dengan berbagai bentuk format warna, seperti format RGB, hex code, atau label warna biasa seperti ‘r’ untuk red, ‘b’ untuk blue dan lain sebagainya. Dapat dilihat pada code berikut:

import matplotlib.pyplot as plt

# membuat component figure dan axis
fig, ax = plt.subplots()

data_x = [1, 2, 3, 4, 5, 6, 7]
data_y = [10, 20, 25, 30, 15, 18, 10]

# memberikan data kedalam axis
ax.plot(data_x, data_y, marker='D', linestyle='dotted', color='#9934FF')
plt.show()
import matplotlib.pyplot as plt
import numpy as np

plt.figure(figsize=(12,8))
x = np.linspace(0, 10, 100)
plt.plot(x, np.sin(x), color='green') # menggunakan nama dari warnanya
plt.plot(x, np.sin(x-1), color='m') # menggunakan format rgbcmyk
plt.plot(x, np.sin(x-2), color='0.5') # menggunakan format grayscale (0 1)
plt.plot(x, np.sin(x-3), color='#FF0037') # menggunakan format RRGGBB, value from 00 to FF
plt.plot(x, np.sin(x-4), color=(0,1,0.5)) # format (R, G, B) 0-1
plt.plot(x, np.sin(x-5), color='DarkGreen') # HTML color names support
plt.show()

Custom Axis Label and Title

Komponen lain yang penting untuk di custom adalah axis label karena axis label menunjukan variabel apa yang sedang di plot.

Axis terdapat 2, yaitu x-axis dan y-axis. untuk mengubah x-axis dapat menggungkan method set_xlabel(), untuk mengubah y-axis dapat menggungkan set_ylabel().

Title juga adalah komponen yang sangat penting untuk menunjukan data apa yang sedang di visualisasikan. Untuk mengubah title dapat menggunakan method set_title().

Perhatikan contoh code berikut:

import matplotlib.pyplot as plt

# membuat component figure dan axis
fig, ax = plt.subplots()

data_x = [1, 2, 3, 4, 5, 6, 7]
data_y = [10, 20, 25, 30, 15, 18, 10]

# memberikan data kedalam axis
ax.plot(data_x, data_y, marker='D', linestyle='dotted', color='#9934FF')

# mengubah axis label dan title
ax.set_xlabel('X Label Axis')
ax.set_ylabel('Y Label Axis')
ax.set_title('Title of Graph')

plt.show()

Axis Limit

Kita bisa membatasi axis dari data kita dengan menggunakan atribut xlim, ylim maupun atribut .axis, seperti berikut:

plt.figure(figsize=(8,6))
plt.plot(x, x+1, linestyle='solid')
plt.plot(x, x+2, linestyle='dashed')
plt.show()
#menggunakan method .xlim dan .ylim
plt.figure(figsize=(8,6))
plt.plot(x, x+1, linestyle='solid')
plt.plot(x, x+2, linestyle='dashed')
plt.xlim(2,8)
plt.ylim(2,10)
plt.show()

#menggunakan .axis
plt.figure(figsize=(8,6))
plt.plot(x, x+1, linestyle='solid')
plt.plot(x, x+2, linestyle='dashed')
plt.axis([2,8,2,10]) # [xmin, xmax, ymin, ymax]
plt.show()

Legend

Legend adalah label data yang muncul dalam sebuah plot. dengan memberikan legend akan lebih mempermudah kita dalam membaca data.

plt.figure(figsize=(7,6))
plt.plot(x, np.sin(x), label='Sin x')
plt.plot(x, np.cos(x), label='Cos x')
plt.legend(loc='upper center')
plt.show()

Marker Data Point

Coba perhatikan bahwa bentuk plot dari data adalah berupa line plot, tidak dapat di ketahui dimana tepatnya data poin terletak. Terdapat sebuah argument dalam methode plot untuk memberikan marker/tanda terhadap data poin, argument tersebut adalah marker, perhatikan kode berikut:

import matplotlib.pyplot as plt

# membuat component figure dan axis
fig, ax = plt.subplots()

data_x = [1, 2, 3, 4, 5, 6, 7]
data_y = [10, 20, 25, 30, 15, 18, 10]

# memberikan data kedalam axis
ax.plot(data_x, data_y, marker='o')
plt.show()

Di atas telah di berikan nilai ‘o’ terhadap argument marker, ‘o’ artinya bulat, jadi di berikan marker bulat terhadap setiap data poin, sehingga dapat lebih jelas membedakan antara garis penghubung dengan data poin.

Nilai marker tidak hanya ‘o’ berikut opsi nilai untuk memberikan berbagai jenis bentuk marker terhadap data poin.

source : https://matplotlib.org/1.4.1/api/markers_api.html
plt.figure(figsize=(8,7))
x = np.random.RandomState(0)
list_marker = ['o', 'p', 'v', '+', 'x']
for marker in list_marker:
    plt.plot(x.rand(5
), x.rand(5), marker=marker, linestyle='None', label=marker)

plt.legend()
plt.show()

Multi Plot

Pada bagian pertama, telah di tunjukan bahwa memungkinkan untuk membuat multiple data plot dalam satu axis. seperti ini:

fig, ax = plt.subplots()
data_x1 = [1, 2, 3, 4]
data_y1 = [10, 20, 25, 30]
data_x2 = [1, 2, 3, 4, 5]
data_y2 = [5, 15, 20, 25, 30]
ax.plot(data_x1, data_y1)
ax.plot(data_x2, data_y2)
plt.show()

Namun, dalam beberapa kasus, ketika multiple plots di masukan ke dalam satu axes, dapat memungkinkan membuat objek visualisasi menjadi tidak rapi. contohnya seperti ini:

fig, ax = plt.subplots()
data_x1 = [1, 2, 3, 4]
data_y1 = [10, 20, 25, 30]
data_x2 = [1, 2, 3, 4, 5]
data_y2 = [800, 1005, 900, 195, 700]
ax.plot(data_x1, data_y1)
ax.plot(data_x2, data_y2)
plt.show()

atau seperti ini:

data_x1 = [1, 2, 3, 4]
data_y1 = [10, 20, 25, 30]
data_x2 = [1, 2, 3, 4, 5]
data_y2 = [20, 25, 20, 40, 50]
data_x3 = data_x2
data_y3 = [50, 10, 30, 15, 30]
data_x4 = data_x2
data_y4 = [10, 40, 24, 30, 29]

fig, ax = plt.subplots()
ax.plot(data_x1, data_y1)
ax.plot(data_x2, data_y2)
ax.plot(data_x3, data_y3)
ax.plot(data_x4, data_y4)
plt.show()

Terdapat berbagai kasus yang apabila kita memplot data dalam satu axis, dapat membuat data visualisasi kita menjadi berantakan sehingga kita susah untuk menemukan pola.

Pada kasus pertama, perbedaan yang besar nilai y antara data pertama dan kedua membuat data pertama menjadi tidak jelas visualisasinya, tidak jelas terlihat pola grafiknya.

Pada kasus kedua banyaknya plot data membuat visualisasi menjadi berantakan tak karuan. hal ini dapat meangganggu proses analisis dalam menemukan pola.

Oleh karena itu, solusinya adalah membuat multiple axis, dan meletakan data di axis-axis yang berbeda. Ada beberapa cara yang bisa digunakan untuk membuat multiple subplots.

with plt.axes()

plt.axes akan menambahkan suatu ke axes ke dalam figure dan menjadikannya axes terbaru, sebagai contoh:

plt.figure(figsize=(12,8))
x = np.linspace(0, 10, 20)
ax = plt.axes()
ax2 = plt.axes((0.67, 0.67, 0.2, 0.2))
ax.plot(x, x+1)
ax2.plot(x, np.cos(x))

with fig.add_axes

import numpy as np
x = np.arange(10)
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_axes([0.1, 0.5, 0.8, 0.4])
ax2 = fig.add_axes([0.1, 0.1, 0.8, 0.4])
ax1.plot(x, np.cos(x))
ax2.plot(x, np.sin(x))

with plt.subplot

plt.subplot digunakan untuk membuat multiple plots yang memiliki weight dan height yang sama.

plt.subplot(1,2,1)
 # baris 1, kolom 2, posisi ke 1
plt.text(0.5, 0.5, str((1,2,1)), fontsize=18, ha='center')
plt.subplot(1,2,2)
 # # baris 1, kolom 2, posisi ke 2
plt.text(0.5, 0.5, str((1,2,2)), fontsize=18, ha='center')
plt.figure(figsize=(12,8))
for i in range(1,7):
    plt.subplot(2, 3, i)
    plt.text(0.5, 0.5, str((2,3,i)), fontsize=18, ha='center')

with plt.subplots

Metode subplots ini memiliki argument untuk mengatur jumlah axis yang di hasilkan, argument ini adalah nrows dan ncols. tidak memberikan nilai pada argument ini di contoh-contoh sebelumnya karena secara default, nrows dan ncols bernilai satu.

Untuk menghasilkan multiple axis, bisa di lakukan dengan memberikan nilai nrows dan ncols lebih dari satu, seperti ini:

fig, ax = plt.subplots(nrows=3, ncols=2)
print('Figure ini memiliki {0} axis di baris dan {1} axis di column'.format(ax.shape[0], ax.shape[1]))
print(ax)
===========================
Figure ini memiliki 3 axis di baris dan 2 axis di column
[[<matplotlib.axes._subplots.AxesSubplot object at 0x0000024384AD4248>
  <matplotlib.axes._subplots.AxesSubplot object at 0x00000243849B3A88>]
 [<matplotlib.axes._subplots.AxesSubplot object at 0x0000024384A2B708>
  <matplotlib.axes._subplots.AxesSubplot object at 0x0000024384A23908>]
 [<matplotlib.axes._subplots.AxesSubplot object at 0x0000024384981D88>
  <matplotlib.axes._subplots.AxesSubplot object at 0x000002438494E788>]]

Coba perhatikan dengan attribute shape didapatkan bahwa dimensi dari objek axis adalah 3, 2, artinya axis memiliki 3 rows dan 2 columns. dan ketika variable ax di print. dihasilkan sebuah nested list berisi 3 elemen list didlam element list terluar, dan dalam setiap list di dalam list terdapat objek axis berjumlah 2. ini artinya adalah bahwa ax[0] akan menghasilkan objek list berisi objek axis di row pertama. dan setereusnya.

Untuk lebih jelasnya, mari lihat bentuk dari figure ini:

fig, ax = plt.subplots(nrows=3, ncols=2)
plt.show()

Mari kita coba membuat multiple subplots dengan memberikan text seperti metode subplot, seperti berikut:

fig, ax = plt.subplots(nrows=2, ncols=3, figsize=(12,8))
ax = ax.flatten()
for i in range(6):
    ax[i].text(0.5, 0.5, str((2,3,i)), fontsize=18, ha='center')

Sekarang mari coba membuat visualisasi data 4 plots dengan multiple axis menggunakan plt.subplots().

import matplotlib.pyplot as plt

data_x1 = [1, 2, 3, 4]
data_y1 = [10, 20, 25, 30]
data_x2 = [1, 2, 3, 4, 5]
data_y2 = [20, 25, 20, 40, 50]
data_x3 = data_x2
data_y3 = [50, 10, 30, 15, 30]
data_x4 = data_x2
data_y4 = [10, 40, 24, 30, 29]

fig, ax = plt.subplots(nrows=2, ncols=2)
ax[0][0].plot(data_x1, data_y1)
ax[0][1].plot(data_x2, data_y2)
ax[1][0].plot(data_x3, data_y3)
ax[1][1].plot(data_x4, data_y4)
plt.show()

Coba perhatikan bahwa axis-y di setiap axis mempunyai interval yang berbeda-beda, begitu pula axis-x nya pada axis baris pertama column pertama hanya pada interval 1-4, sedangkan yang lainnya 1-5. Visualisasi ini bisa di improve agar mendapatkan interval axis yang sama dengan menambahkan argument sharex dan sharey terhadap method subplots. seperti ini:

import matplotlib.pyplot as plt

data_x1 = [1, 2, 3, 4]
data_y1 = [10, 20, 25, 30]
data_x2 = [1, 2, 3, 4, 5]
data_y2 = [20, 25, 20, 40, 50]
data_x3 = data_x2
data_y3 = [50, 10, 30, 15, 30]
data_x4 = data_x2
data_y4 = [10, 40, 24, 30, 29]

fig, ax = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
ax[0][0].plot(data_x1, data_y1)
ax[0][1].plot(data_x2, data_y2)
ax[1][0].plot(data_x3, data_y3)
ax[1][1].plot(data_x4, data_y4)
plt.show()

with inset_axes

inset_axes adalah suatu metode dalam Matplotlib.pyplot yang digunakan untuk membuat axes di dalam sebuah axes. Seperti contoh berikut:

fig, ax = plt.subplots(figsize=(8,7))
x = np.linspace(0, 10, 20)
ax.plot(x, np.sin(x))

ins1 = ax.inset_axes([0.9, 0.9, 0.3, 0.3])
ins1.plot(x, np.cos(x))

ins2 = ax.inset_axes([-0.1, 0.9, 0.3, 0.3])
ins2.plot(x, np.tan(x))

plt.show()

GridSpec

GridSpec digunakan untuk menspesifikasikan geometry Grid dari subplot. Seperti contoh:

grid = plt.GridSpec(2, 3, wspace=0.3, hspace = 0.3)

plt.figure(figsize=(12,8))
plt.subplot(grid[0, 0])
plt.subplot(grid[0, 1:])
plt.subplot(grid[1, :2])
plt.subplot(grid[1, 2]);