Grafik sering menunjukkan masalah data yang lolos dari ringkasan angka: pencilan tersembunyi, fitur yang tidak informatif, atau kelas yang saling tumpang tindih. Matplotlib adalah pustaka gambar standar di ekosistem Python dan menjadi alat utama untuk memantau kurva pelatihan model. Chapter ini memakai object-oriented API matplotlib (fig dan ax) agar kode tetap rapi ketika grafik menjadi kompleks, membuat empat jenis grafik dasar, lalu menutup dengan visualisasi dua kelas beserta garis keputusan — pola yang akan berulang di hampir setiap proyek klasifikasi.
Dua Antarmuka matplotlib #
Matplotlib menyediakan dua gaya penulisan. Gaya state-based memakai plt.plot(...) yang menggambar ke “sumbu aktif” — cepat untuk sketsa, tetapi membingungkan ketika satu gambar memiliki banyak panel. Gaya object-oriented (OO) membuat dua objek secara eksplisit: fig mewakili kanvas gambar penuh dan ax mewakili satu panel sumbu berisi data. Seluruh penggambaran, judul, dan label diperintahkan melalui objek ax, sehingga setiap panel dapat dikendalikan satu per satu tanpa bergantung pada status tersembunyi. Kita akan memakai gaya OO sepenuhnya pada chapter ini.
Empat Grafik Dasar #
Berkas empat-grafik.py membuat satu gambar berisi empat panel: line plot, bar chart, histogram, dan scatter plot. Data yang digambar adalah data sintetis 60 siswa dengan seed tetap, dan hasilnya disimpan sebagai berkas PNG di folder yang sama.
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
# Data sintetis: jam belajar dan nilai ujian 60 siswa
jam_belajar = np.random.rand(60) * 8.0
nilai = 40 + 7.5 * jam_belajar + np.random.randn(60) * 5.0
# Objek gambar dan sumbu: satu figur 2x2
fig, ax = plt.subplots(2, 2, figsize=(9, 6), constrained_layout=True)
# Grafik 1 (kiri atas): line plot fungsi sigmoid
z = np.linspace(-6, 6, 200)
ax[0, 0].plot(z, 1 / (1 + np.exp(-z)), color="tab:blue")
ax[0, 0].set_title("Fungsi aktivasi sigmoid")
ax[0, 0].set_xlabel("nilai z")
ax[0, 0].set_ylabel("sigmoid(z)")
# Grafik 2 (kanan atas): bar chart rata-rata nilai per kelompok
kelompok = ["<2 jam", "2-5 jam", ">5 jam"]
mask = [
jam_belajar < 2,
(jam_belajar >= 2) & (jam_belajar <= 5),
jam_belajar > 5,
]
rata = [nilai[m].mean() for m in mask]
ax[0, 1].bar(kelompok, rata, color="tab:orange")
ax[0, 1].set_title("Rata-rata nilai per kelompok")
ax[0, 1].set_xlabel("lama belajar")
ax[0, 1].set_ylabel("rata-rata nilai")
# Grafik 3 (kiri bawah): histogram sebaran nilai
ax[1, 0].hist(nilai, bins=10, color="tab:green", edgecolor="white")
ax[1, 0].set_title("Sebaran nilai ujian")
ax[1, 0].set_xlabel("nilai")
ax[1, 0].set_ylabel("jumlah siswa")
# Grafik 4 (kanan bawah): scatter jam belajar vs nilai
ax[1, 1].scatter(jam_belajar, nilai, s=25, alpha=0.7, color="tab:red")
ax[1, 1].set_title("Jam belajar vs nilai")
ax[1, 1].set_xlabel("jam belajar")
ax[1, 1].set_ylabel("nilai")
fig.suptitle("Empat jenis grafik dasar matplotlib")
fig.savefig("empat-grafik.png", dpi=110, bbox_inches="tight")
print("grafik tersimpan: empat-grafik.png")
print("rata-rata nilai per kelompok:", np.round(rata, 2))Output yang Dihasilkan:
grafik tersimpan: empat-grafik.png
rata-rata nilai per kelompok: [48.26 65.9 90.27]Hasil gambarnya tampak seperti berikut:

Mari kita telaah kode di atas baris per baris:
- Baris 3 (
matplotlib.use("Agg")): backendAggmenggambar ke berkas tanpa layar grafis. Pada skrip yang berjalan di server atau lingkungan tanpa tampilan, backend ini mencegah galat pembukaan jendela. - Baris 13 (
fig, ax = plt.subplots(2, 2, ...)): satu panggilan menghasilkan kanvasfigdan array sumbuaxberukuran 2x2 — total empat panel. Parameterfigsize=(9, 6)mengatur ukuran gambar dalam inci. - Baris 17 (
ax[0, 0].plot(z, ...)): panel kiri atas menerima line plot kurva sigmoid; akses panel memakai indeks baris-kolom pada arrayax. - Baris 26-31 (
mask = [...]): tiga filter boolean NumPy membagi siswa ke tiga kelompok lama belajar, lalunilai[m].mean()menghitung rata-rata tiap kelompok — pola penyaringan dari Chapter pandas tetap berlaku di NumPy. - Baris 35 (
ax[0, 1].bar(...)): bar chart membandingkan rata-rata tiga kelompok; keluaran teks memperlihatkan nilai 48.26, 65.9, dan 90.27. - Baris 41 (
ax[1, 0].hist(nilai, bins=10)): histogram membagi rentang nilai ke 10 wadah dan menghitung jumlah siswa per wadah. - Baris 47 (
ax[1, 1].scatter(...)): scatter plot menampilkan pasangan (jam belajar, nilai) sebagai titik; parameteralpha=0.7membuat titik bertumpuk tetap terbaca. - Baris 55 (
fig.savefig("empat-grafik.png", dpi=110, ...)):savefigmenulis gambar ke berkas — setiap panel memuat judul dan label sumbu sendiri karena ditetapkan perax.
Scatter Dua Kelas dan Garis Keputusan #
Pola visualisasi paling penting di klasifikasi adalah sebaran kelas pada bidang fitur. Berkas sebar-kelas.py membuat dua kelompok titik sintetis, menggambar keduanya dengan warna berbeda, menambahkan garis keputusan sederhana, lalu menghitung akurasi garis tersebut.
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
# Data sintetis dua kelas yang saling berdekatan
n = 50
kelas0 = np.random.randn(n, 2) * 2.0 + np.array([2.0, 2.5])
kelas1 = np.random.randn(n, 2) * 2.0 + np.array([5.0, 5.5])
fig, ax = plt.subplots(figsize=(6.5, 5.5), constrained_layout=True)
ax.scatter(kelas0[:, 0], kelas0[:, 1], s=25, alpha=0.8, label="Kelas 0")
ax.scatter(kelas1[:, 0], kelas1[:, 1], s=25, alpha=0.8, label="Kelas 1")
# Garis keputusan sederhana: titik dengan fitur1 + fitur2 >= 7.5 masuk Kelas 1
batas_x = np.array([-4.0, 10.0])
batas_y = 7.5 - batas_x
ax.plot(batas_x, batas_y, "k--", linewidth=2, label="Garis keputusan")
ax.set_xlabel("Fitur 1")
ax.set_ylabel("Fitur 2")
ax.set_title("Sebaran dua kelas dan garis keputusan")
ax.legend(loc="upper left")
fig.savefig("sebar-kelas.png", dpi=110, bbox_inches="tight")
print("grafik tersimpan: sebar-kelas.png")
# Akurasi garis keputusan sederhana pada data latih
prediksi0 = (kelas0.sum(axis=1) >= 7.5).astype(int)
prediksi1 = (kelas1.sum(axis=1) >= 7.5).astype(int)
benar = np.sum(prediksi0 == 0) + np.sum(prediksi1 == 1)
print(f"prediksi benar: {benar} dari {2 * n} titik")
print(f"akurasi : {benar / (2 * n):.2%}")Output yang Dihasilkan:
grafik tersimpan: sebar-kelas.png
prediksi benar: 88 dari 100 titik
akurasi : 88.00%
Mari kita telaah kode di atas baris per baris:
- Baris 14-15 (
kelas0 = ...,kelas1 = ...): setiap kelas adalah 50 titik acak berdistribusi normal yang digeser ke pusat berbeda — kelas 0 di sekitar(2.0, 2.5)dan kelas 1 di sekitar(5.0, 5.5). Penyebaran* 2.0membuat kedua kelompok saling mendekat, sehingga pemisahan tidak sempurna. - Baris 18-20 (
ax.scatter(...)): kedua kelas digambar pada sumbu yang sama dengan label berbeda. Pemanggilanscatterdua kali menghasilkan dua warna otomatis dan dua entri pada legend. - Baris 23-25 (
batas_y = 7.5 - batas_x): garis keputusan mengikuti aturanfitur1 + fitur2 = 7.5, dihitung pada dua titik ujung lalu digambar bergaris putus-putus dengan format"k--". Titik di atas garis diprediksi masuk Kelas 1. - Baris 32 (
ax.legend(loc="upper left")): legend menampilkan nama setiap kelas dan garis keputusan sesuai parameterlabelyang kita isi saat menggambar. - Baris 35-40 (
prediksi0 = ...):kelas0.sum(axis=1)menjumlahkan kedua fitur setiap titik, hasilnya dibandingkan dengan ambang 7.5, lalu dihitung berapa titik yang garis ini pisahkan dengan benar. Akurasi 88% memperlihatkan garis lurus sederhana sudah cukup baik, tetapi 12 titik tetap berada di sisi yang keliru — tugas model yang akan kita bangun adalah menemukan pemisah yang lebih baik.
Memilih Jenis Grafik #
Tabel berikut memetakan jenis grafik ke pemakaian paling umum dalam proyek deep learning:
| Jenis grafik | Fungsi | Pemakaian khas di deep learning |
|---|---|---|
| Line | ax.plot(x, y) | Kurva loss dan akurasi per epoch |
| Scatter | ax.scatter(x, y) | Sebaran fitur, proyeksi embedding dua dimensi |
| Bar | ax.bar(label, nilai) | Perbandingan metrik antar model |
| Histogram | ax.hist(data, bins=...) | Sebaran fitur, distribusi bobot, analisis galat |
| Heatmap | ax.imshow(matriks) | Matriks konfusi dan visualisasi citra |
Galeri contoh resmi matplotlib di matplotlib.org/stable/gallery memuat ratusan resep grafik siap pakai, dan panduan pemula tersedia di matplotlib.org/stable/tutorials .
Visualisasi membantu kita memahami data dan hasil model, tetapi ada satu ranah yang tidak terlihat pada grafik: keandalan angka di balik layar. Pembulatan titik mengambang, nilai inf dan NaN, sampai softmax yang meluap akan kita bedah pada Chapter komputasi numerik — fondasi terakhir sebelum membangun neural network.