Skip to main content

Visualisasi Data dari Pandas - 6

Membuat Visualisasi dengan Object-Oriented Matplotlib dari Awal

Pada materi sebelumnya kita telah mempelajari perbedaan antara Pyplot Method dan Object-Oriented (OO) Method pada Matplotlib.

Pada materi ini kita akan menggunakan pendekatan Object-Oriented secara lebih langsung, mulai dari:

  1. Membuat Figure dan Axes.
  2. Memasukkan data ke dalam Axes.
  3. Menambahkan judul dan label.
  4. Membuat legend.
  5. Menambahkan garis acuan.
  6. Melakukan customization pada visualisasi.

Pendekatan ini sangat berguna ketika kita ingin memiliki kontrol yang lebih jelas terhadap setiap komponen grafik.


Konsep Utama Object-Oriented Method

Dalam Object-Oriented Method, kita bekerja secara eksplisit dengan objek:

Figure

└── Axes

├── Plot
├── Title
├── X Label
├── Y Label
├── Legend
└── Reference Line

Pola dasarnya adalah:

fig, ax = plt.subplots()

Kemudian seluruh elemen visualisasi diarahkan ke objek ax.

Contoh:

ax.scatter(...)
ax.set(...)
ax.legend(...)
ax.axhline(...)

Dataset yang Digunakan

Pada contoh ini kita menggunakan dataset Heart Disease.

agesexcptrestbpscholfbsrestecgthalachexangoldpeakslopecathaltarget
63131452331015002.30011
37121302500118703.50021
41011302040017201.42021
56111202360117800.82021
57001203540116310.62021

Misalnya dataset sudah dimuat:

import pandas as pd

heart_disease = pd.read_csv(
"heart-disease.csv"
)

Kita dapat membuat subset data yang memiliki usia lebih dari 50 tahun:

over_50 = heart_disease[
heart_disease["age"] > 50
]

Kemudian periksa data:

over_50.head()

Subset tersebut akan digunakan untuk membuat scatter plot.


Import Matplotlib

Import Matplotlib:

import matplotlib.pyplot as plt

Sehingga setup awal dapat menjadi:

import pandas as pd
import matplotlib.pyplot as plt

heart_disease = pd.read_csv(
"heart-disease.csv"
)

over_50 = heart_disease[
heart_disease["age"] > 50
]

Langkah 1 - Membuat Figure dan Axes

Langkah pertama adalah membuat Figure dan Axes:

fig, ax = plt.subplots(
figsize=(10, 6)
)

Kode tersebut menghasilkan dua objek:

fig → Figure
ax → Axes

Secara konseptual:

Figure
┌────────────────────────────────────┐
│ │
│ Axes │
│ │
│ │
│ │
└────────────────────────────────────┘

Memahami fig

Variabel:

fig

merupakan objek Figure.

Figure adalah container atau wadah keseluruhan visualisasi.

Figure dapat berisi satu atau lebih Axes.

Contoh:

Figure
├── Axes 1
├── Axes 2
├── Axes 3
└── Axes 4

Ketika hanya membuat satu subplot:

fig, ax = plt.subplots()

maka Figure memiliki satu Axes.


Memahami ax

Variabel:

ax

merupakan objek Axes.

Axes adalah area tempat kita membuat plot.

Contoh:

ax.scatter(...)

berarti membuat scatter plot pada Axes tersebut.

Dengan OO Method, kita tidak hanya memanggil fungsi global seperti:

plt.scatter(...)

tetapi secara eksplisit menentukan Axes:

ax.scatter(...)

Mengatur Ukuran Figure

Ukuran Figure dapat diatur menggunakan:

figsize=(10, 6)

Contoh:

fig, ax = plt.subplots(
figsize=(10, 6)
)

Nilai figsize menggunakan satuan inch.

Dalam contoh tersebut:

Lebar = 10 inch
Tinggi = 6 inch

Langkah 2 - Membuat Scatter Plot

Setelah Figure dan Axes dibuat, kita dapat memasukkan data.

Gunakan:

scatter = ax.scatter(
x=over_50["age"],
y=over_50["chol"],
c=over_50["target"]
)

Pada kode tersebut:

x=over_50["age"]

menentukan data untuk sumbu X.

y=over_50["chol"]

menentukan data untuk sumbu Y.

Sedangkan:

c=over_50["target"]

digunakan untuk menentukan warna titik berdasarkan nilai target.


Memahami Variabel scatter

Perhatikan bahwa hasil ax.scatter() disimpan ke:

scatter

Contoh:

scatter = ax.scatter(
x=over_50["age"],
y=over_50["chol"],
c=over_50["target"]
)

Objek tersebut berguna karena nantinya kita dapat mengambil informasi dari scatter plot untuk membuat legend.

Contohnya:

scatter.legend_elements()

Memahami Sumbu X

Pada contoh:

x=over_50["age"]

kolom:

age

digunakan sebagai variabel X.

Artinya, posisi horizontal setiap titik menunjukkan nilai usia.


Memahami Sumbu Y

Pada contoh:

y=over_50["chol"]

kolom:

chol

digunakan sebagai variabel Y.

Artinya, posisi vertikal setiap titik menunjukkan nilai kolesterol pada data yang digunakan.


Memahami Parameter c

Parameter:

c=over_50["target"]

digunakan untuk menentukan warna titik berdasarkan nilai target.

Jika target memiliki beberapa kategori, warna titik dapat membantu membedakan kelompok tersebut secara visual.

Secara konseptual:

age

│ ●
│ ● ●
│ ● ●
│ ●
└──────────────── chol

Warna setiap titik berasal dari nilai pada kolom target.


Langkah 3 - Menambahkan Judul dan Label

Setelah membuat scatter plot, kita dapat memberikan informasi tambahan menggunakan:

ax.set()

Contoh:

ax.set(
title="Heart Disease and Cholesterol Levels",
xlabel="Age",
ylabel="Cholesterol"
)

Kode tersebut mengatur:

  • judul grafik;
  • label sumbu X;
  • label sumbu Y.

matplotlib


Mengatur Judul

Kita dapat mengatur judul menggunakan:

ax.set_title(
"Heart Disease and Cholesterol Levels"
)

Alternatif yang lebih ringkas:

ax.set(
title="Heart Disease and Cholesterol Levels"
)

Mengatur Label Sumbu X

Gunakan:

ax.set_xlabel(
"Age"
)

atau melalui:

ax.set(
xlabel="Age"
)

Label tersebut membantu pembaca memahami bahwa sumbu X merepresentasikan usia.


Mengatur Label Sumbu Y

Gunakan:

ax.set_ylabel(
"Cholesterol"
)

atau:

ax.set(
ylabel="Cholesterol"
)

Label ini menunjukkan bahwa sumbu Y merepresentasikan nilai kolesterol.


Menggunakan ax.set() Sekaligus

Daripada menulis tiga perintah terpisah:

ax.set_title(...)
ax.set_xlabel(...)
ax.set_ylabel(...)

kita dapat menggunakan:

ax.set(
title="Heart Disease and Cholesterol Levels",
xlabel="Age",
ylabel="Cholesterol"
)

Pendekatan ini membuat customization dasar menjadi lebih ringkas.


Langkah 4 - Membuat Legend

Karena warna titik ditentukan berdasarkan:

c=over_50["target"]

kita mungkin ingin memberikan keterangan mengenai kelompok warna tersebut.

Matplotlib menyediakan:

scatter.legend_elements()

untuk mengambil elemen legend berdasarkan scatter plot.

Contoh:

ax.legend(
*scatter.legend_elements(),
title="Target"
)

matplotlib


Memahami legend_elements()

Perhatikan:

scatter.legend_elements()

Method tersebut menghasilkan elemen yang dapat digunakan untuk membuat legend.

Kemudian:

*

digunakan untuk melakukan argument unpacking terhadap hasil tersebut.

Sehingga:

ax.legend(
*scatter.legend_elements(),
title="Target"
)

memberikan elemen tersebut kepada ax.legend().


Menambahkan Judul pada Legend

Parameter:

title="Target"

memberikan judul pada legend.

Sehingga secara konseptual:

Target
──────
● 0
● 1

Angka atau label yang muncul akan mengikuti nilai kategori yang digunakan pada kolom target.


Langkah 5 - Menambahkan Garis Acuan

Kita juga dapat menambahkan garis horizontal menggunakan:

ax.axhline()

Misalnya kita ingin menampilkan nilai rata-rata kolesterol.

Pertama hitung mean:

over_50["chol"].mean()

Kemudian gunakan hasil tersebut:

ax.axhline(
over_50["chol"].mean(),
linestyle="--"
)

matplotlib


Memahami axhline()

Method:

ax.axhline()

digunakan untuk membuat horizontal reference line.

Secara visual:

Cholesterol

│ ● ●
│ ●
────┼────────────────── ← Mean
│ ● ●

└────────────────── Age

Garis tersebut membantu memberikan titik referensi untuk membaca posisi data terhadap nilai rata-rata.


Memahami linestyle="--"

Parameter:

linestyle="--"

menghasilkan garis putus-putus.

Contoh:

ax.axhline(
over_50["chol"].mean(),
linestyle="--"
)

Kita dapat menggunakan berbagai line style, misalnya:

"-" → garis solid
"--" → garis putus-putus
":" → garis titik-titik
"-." → kombinasi garis dan titik

Menghitung Mean

Mean atau rata-rata dapat dihitung menggunakan:

over_50["chol"].mean()

Secara matematis:

Mean = jumlah seluruh nilai / jumlah observasi

Misalnya terdapat data:

180
200
220

maka:

Mean = (180 + 200 + 220) / 3
= 200

Dalam contoh dataset, nilai aktual mean akan bergantung pada data yang digunakan.


Contoh Lengkap OO Method

Berikut implementasi lengkap dari awal:

import pandas as pd
import matplotlib.pyplot as plt

# Membaca dataset
heart_disease = pd.read_csv(
"heart-disease.csv"
)

# Mengambil data dengan age > 50
over_50 = heart_disease[
heart_disease["age"] > 50
]

# 1. Membuat Figure dan Axes
fig, ax = plt.subplots(
figsize=(10, 6)
)

# 2. Membuat scatter plot
scatter = ax.scatter(
x=over_50["age"],
y=over_50["chol"],
c=over_50["target"]
)

# 3. Menambahkan title dan label
ax.set(
title="Heart Disease and Cholesterol Levels",
xlabel="Age",
ylabel="Cholesterol"
)

# 4. Menambahkan legend
ax.legend(
*scatter.legend_elements(),
title="Target"
)

# 5. Menambahkan garis mean
ax.axhline(
over_50["chol"].mean(),
linestyle="--"
)

# Menampilkan grafik
plt.show()

matplotlib


Memahami Alur Kode

Kode tersebut dapat dibagi menjadi lima tahap:

1. Setup

Figure + Axes

2. Plot

Scatter Plot

3. Labeling

Title + X Label + Y Label

4. Legend

Target Categories

5. Reference Line

Mean Cholesterol

Struktur seperti ini membuat kode visualisasi lebih mudah dibaca.


Workflow Object-Oriented Matplotlib

Secara umum, workflow OO Method dapat ditulis:

Create Figure

Create Axes

Plot Data

Customize Axes

Add Supporting Elements

Adjust Layout

Display / Save

Dalam kode:

fig, ax = plt.subplots()

ax.scatter(...)

ax.set(...)

ax.legend(...)

ax.axhline(...)

fig.tight_layout()

plt.show()

Menambahkan tight_layout()

Jika grafik memiliki banyak elemen, kita dapat menggunakan:

fig.tight_layout()

Contoh:

fig.tight_layout()

plt.show()

Method ini membantu mengatur spacing antar elemen Figure agar tidak terlalu bertumpuk.


Menyimpan Grafik

Selain menampilkan grafik, kita dapat menyimpannya sebagai file.

Gunakan:

fig.savefig(
"heart-disease-plot.png"
)

Contoh:

fig, ax = plt.subplots(
figsize=(10, 6)
)

ax.scatter(
over_50["age"],
over_50["chol"],
c=over_50["target"]
)

ax.set(
title="Heart Disease and Cholesterol Levels",
xlabel="Age",
ylabel="Cholesterol"
)

fig.tight_layout()

fig.savefig(
"heart-disease-plot.png"
)

plt.show()

Pendekatan ini berguna ketika grafik akan digunakan untuk:

  • laporan;
  • dokumentasi;
  • presentasi;
  • artikel;
  • publikasi;
  • analisis lebih lanjut.

Mengatur Batas Sumbu

OO Method juga memudahkan kita mengatur batas sumbu.

Contoh:

ax.set_xlim(
[45, 100]
)

Untuk sumbu Y:

ax.set_ylim(
[100, 400]
)

Contoh:

ax.set_xlim(
[45, 100]
)

ax.set_ylim(
[100, 400]
)

Pengaturan ini dapat membantu ketika kita ingin fokus pada area tertentu.

Namun, batas sumbu sebaiknya dipilih berdasarkan kebutuhan analisis dan tidak digunakan untuk menyembunyikan bagian data secara menyesatkan.


Menambahkan Beberapa Elemen pada Satu Axes

Salah satu kekuatan OO Method adalah kita dapat menambahkan banyak elemen ke Axes yang sama.

Contohnya:

ax.scatter(...)

ax.axhline(...)

ax.set(...)

ax.legend(...)

Semuanya bekerja pada objek:

ax

Secara konseptual:

Figure


Axes

┌─────────┼─────────┐
▼ ▼ ▼
Scatter Mean Legend
Plot Line

Mengapa Menyimpan Hasil scatter()?

Kita dapat langsung menulis:

ax.scatter(
x=over_50["age"],
y=over_50["chol"],
c=over_50["target"]
)

Tetapi pada contoh ini kita menyimpan hasilnya:

scatter = ax.scatter(
x=over_50["age"],
y=over_50["chol"],
c=over_50["target"]
)

Alasannya adalah kita membutuhkan objek scatter untuk membuat legend:

scatter.legend_elements()

Jadi objek hasil plotting dapat digunakan kembali untuk customization berikutnya.


Pyplot vs OO pada Contoh Ini

Pendekatan Pyplot

Secara sederhana kita dapat menulis:

plt.scatter(
over_50["age"],
over_50["chol"],
c=over_50["target"]
)

plt.title(
"Heart Disease and Cholesterol Levels"
)

plt.xlabel(
"Age"
)

plt.ylabel(
"Cholesterol"
)

plt.show()

Pendekatan OO

Dengan OO Method:

fig, ax = plt.subplots(
figsize=(10, 6)
)

ax.scatter(
over_50["age"],
over_50["chol"],
c=over_50["target"]
)

ax.set(
title="Heart Disease and Cholesterol Levels",
xlabel="Age",
ylabel="Cholesterol"
)

plt.show()

Pada contoh OO, hubungan antara plot dan Axes terlihat secara eksplisit.


Keuntungan Pendekatan OO

Object-Oriented Method memberikan beberapa keuntungan:

Kontrol terhadap Axes

Kita dapat mengatur Axes tertentu:

ax.set_xlim(...)

Mudah untuk Multi-Plot

Contoh:

fig, ax = plt.subplots(
2,
2
)

Kemudian:

ax[0, 0].scatter(...)
ax[0, 1].hist(...)
ax[1, 0].bar(...)
ax[1, 1].plot(...)

Struktur Kode Lebih Jelas

Kode secara eksplisit menunjukkan:

Figure

Axes

Plot

Customization

Mudah Dikembangkan

Setelah memahami pola:

fig, ax = plt.subplots()

kita dapat menambahkan:

  • title;
  • labels;
  • legend;
  • grid;
  • reference line;
  • limits;
  • annotations;
  • multiple plots;
  • saving.

Kesalahan yang Sering Terjadi

Lupa Membuat Figure dan Axes

OO Method membutuhkan objek Axes.

Gunakan:

fig, ax = plt.subplots()

sebelum:

ax.scatter(...)

Menggunakan plt dan ax Secara Tidak Konsisten

Contoh:

fig, ax = plt.subplots()

ax.scatter(...)

plt.title(...)

Kode tersebut dapat bekerja, tetapi jika tujuan kita adalah mempraktikkan OO Method secara konsisten, lebih baik customization diarahkan ke Axes:

ax.set_title(...)

atau:

ax.set(...)

Lupa Parameter ax pada Pandas

Jika menggunakan Pandas:

fig, ax = plt.subplots()

over_50.plot(
kind="scatter",
x="age",
y="chol",
ax=ax
)

Parameter:

ax=ax

diperlukan agar Pandas menggunakan Axes yang telah kita buat.


Menganggap Garis Mean sebagai Batas

Garis:

ax.axhline(
over_50["chol"].mean(),
linestyle="--"
)

hanya menunjukkan nilai rata-rata.

Garis tersebut bukan batas statistik yang otomatis menentukan apakah suatu data normal, abnormal, atau outlier.


Ringkasan Method Penting

MethodFungsi
plt.subplots()Membuat Figure dan Axes
ax.scatter()Membuat scatter plot
ax.plot()Membuat line plot
ax.bar()Membuat bar plot
ax.hist()Membuat histogram
ax.set()Mengatur beberapa properti Axes
ax.set_title()Mengatur judul
ax.set_xlabel()Mengatur label X
ax.set_ylabel()Mengatur label Y
ax.legend()Menambahkan legend
scatter.legend_elements()Menghasilkan elemen legend dari scatter plot
ax.axhline()Menambahkan garis horizontal
ax.set_xlim()Mengatur batas X
ax.set_ylim()Mengatur batas Y
fig.tight_layout()Mengatur layout
fig.savefig()Menyimpan Figure

Ringkasan Alur OO Method

Pola dasar yang perlu diingat:

# 1. Setup
fig, ax = plt.subplots()

# 2. Plot
ax.scatter(
x,
y
)

# 3. Customize
ax.set(
title="My Plot",
xlabel="X",
ylabel="Y"
)

# 4. Supporting elements
ax.legend()

# 5. Display
plt.show()

Untuk visualisasi yang lebih kompleks:

fig, ax = plt.subplots(
figsize=(10, 6)
)

scatter = ax.scatter(
x=over_50["age"],
y=over_50["chol"],
c=over_50["target"]
)

ax.set(
title="Heart Disease and Cholesterol Levels",
xlabel="Age",
ylabel="Cholesterol"
)

ax.legend(
*scatter.legend_elements(),
title="Target"
)

ax.axhline(
over_50["chol"].mean(),
linestyle="--"
)

fig.tight_layout()

plt.show()

Inti Materi

Object-Oriented Method dapat diringkas menjadi:

plt.subplots()

Figure + Axes

ax.scatter()

ax.set()

ax.legend()

ax.axhline()

fig.tight_layout()

plt.show()

Konsep terpenting adalah bahwa Figure merupakan container keseluruhan, sedangkan Axes merupakan area tempat data divisualisasikan.

Dengan bekerja secara eksplisit menggunakan ax, kita mendapatkan kontrol yang lebih terstruktur terhadap visualisasi.