Data Science
Visualisasi Data Dasar dengan Matplotlib
Pelajari visualisasi data dasar menggunakan Matplotlib di Python. Pahami anatomi Figure dan Axes, pembuatan Line Plot dan Bar Chart, kustomisasi elemen visual, serta ekspor grafik berkualitas tinggi.

Tabel angka yang padat dengan ribuan baris data sering kali gagal menyampaikan pesan bisnis yang mendesak kepada para pemangku kepentingan. Otak manusia jauh lebih cepat mengenali pola, anomali, tren musiman, dan pergeseran distribusi saat data tersebut disajikan dalam bentuk visual ketimbang teks mentah. Sebuah lonjakan trafik server, penurunan konversi penjualan, atau perbandingan kinerja antarcabang toko akan langsung terlihat jelas hanya dalam hitungan detik ketika dipetakan ke dalam bentuk grafik.
Dalam ekosistem Data Science Python, Matplotlib adalah pustaka visualisasi data tertua, paling stabil, dan paling banyak dijadikan fondasi oleh pustaka lain seperti Seaborn dan Pandas Plotting. Diciptakan oleh John D. Hunter pada tahun 2003 untuk meniru kemampuan komputasi grafis MATLAB, Matplotlib memberikan kontrol tingkat rendah (low-level control) yang tak tertandingi terhadap setiap komponen visual grafis Anda.
Yang akan dipelajari
Dalam materi ini, kamu akan menguasai:
- Anatomi dasar kanvas visualisasi Matplotlib: perbedaan fundamental antara Figure dan Axes.
- Pendekatan Object-Oriented (OO) API vs antarmuka fungsional
pyplot. - Pembuatan dan kustomisasi Line Plot untuk melacak tren temporal berbasis deret waktu.
- Pembuatan Bar Chart vertikal dan horizontal untuk membandingkan metrik antar-kategori diskret.
- Kustomisasi estetika profesional: judul, label sumbu, skala, kisi-kisi (grid), legenda, serta rotasi label.
- Teknik ekspor visualisasi ke berkas gambar beresolusi tinggi menggunakan
plt.savefig().
Konsep dan Intuisi: Anatomi Figure dan Axes
Banyak pemula merasa frustrasi saat menggunakan Matplotlib karena mencampuradukkan perintah berbasis stateful plt.plot() dengan antarmuka berbasis objek. Kunci memahami Matplotlib terletak pada pengenalan dua komponen utamanya:
- Figure: Bingkai kanvas terluar. Bayangkan Figure seperti selembar papan gambar kosong atau kanvas lukis. Satu Figure dapat menampung satu atau beberapa grafik (subplot), teks judul global, serta elemen dekoratif lainnya.
- Axes: Area plot spesifik tempat data aktual digambar. Ini adalah "grafik sebenarnya" yang memiliki sistem koordinat (sumbu X dan sumbu Y), garis data, penanda titik (markers), garis kisi (grid), dan label sumbu. Ingat: satu Figure dapat memiliki banyak Axes (misalnya tata letak 2 baris dan 2 kolom).
Berikut visualisasi hierarki anatomi Matplotlib:

+-------------------------------------------------------------+
| Figure (Kanvas Luar Keseluruhan) |
| |
| +-------------------------------------------------------+ |
| | Axes (Area Plot Koordinat) | |
| | Y-Axis Title | |
| | ^ | |
| | | *--* (Line Plot / Marker) | |
| | | / | |
| | | *--* | |
| | +---------------------------------> X-Axis | |
| | X-Axis Title | |
| +-------------------------------------------------------+ |
| |
+-------------------------------------------------------------+
Di dunia profesional, pendekatan Object-Oriented (OO) API (fig, ax = plt.subplots()) sangat direkomendasikan dibandingkan pendekatan fungsional murni (plt.plot()) karena memberikan modularitas penuh dan mencegah kebocoran status (state leakage) ketika Anda membuat visualisasi majemuk.
Praktik Kode Bertahap
Mari kita praktikkan pembuatan visualisasi data dari nol di Google Colab.
1. Memuat Pustaka dan Menyiapkan Data Sintetis
Modul utama yang digunakan adalah matplotlib.pyplot, yang secara konvensi diimpor dengan alias plt.
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# Menyiapkan data historis performa penjualan bulanan (12 bulan)
bulan = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des']
penjualan_2025 = [45, 52, 58, 63, 70, 75, 82, 80, 88, 92, 98, 110] # Dalam jutaan rupiah
penjualan_2026 = [50, 55, 65, 72, 78, 85, 89, 94, 102, 115, 120, 135]
print("Data siap dipetakan ke dalam kanvas Matplotlib.")
Output:
Data siap dipetakan ke dalam kanvas Matplotlib.
2. Membuat Line Plot Menggunakan Object-Oriented API
Line Plot adalah pilihan utama saat kita ingin mengamati laju pertumbuhan atau pola musiman dari waktu ke waktu. Perhatikan bagaimana kita mendefinisikan objek fig dan ax:
# Membuat Figure dan Axes dengan ukuran 10x5 inci
fig, ax = plt.subplots(figsize=(10, 5))
# Menggambar dua garis tren penjualan
ax.plot(bulan, penjualan_2025, marker='o', linewidth=2, linestyle='--', color='#64748b', label='Tahun 2025')
ax.plot(bulan, penjualan_2026, marker='s', linewidth=2.5, linestyle='-', color='#0284c7', label='Tahun 2026')
# Menambahkan anotasi teks dan label pendukung
ax.set_title('Tren Pertumbuhan Penjualan Ritel Bulanan (2025 vs 2026)', fontsize=14, fontweight='bold', pad=15)
ax.set_xlabel('Bulan Operasional', fontsize=11)
ax.set_ylabel('Total Penjualan (Juta Rupiah)', fontsize=11)
# Mengatur batas sumbu Y dan kisi-kisi latar belakang
ax.set_ylim(40, 150)
ax.grid(True, linestyle=':', alpha=0.6)
# Menampilkan legenda di pojok kiri atas
ax.legend(loc='upper left', frameon=True)
# Menampilkan grafik
plt.show()
Output:
(Grafik Line Plot ditampilkan: Dua garis menunjukkan tren naik dari Januari hingga Desember,
garis abu-abu putus-putus untuk 2025 dan garis biru tebal untuk 2026)
Pada kode di atas:
marker='o'danmarker='s'memberikan penanda lingkaran (circle) dan kotak (square) pada setiap titik data.linestyle='--'menghasilkan garis putus-putus.alpha=0.6pada metodegrid()membuat garis kisi samar sehingga tidak mengaburkan garis data utama.
3. Membuat Bar Chart Vertikal untuk Perbandingan Kategori
Bar Chart sangat ideal untuk membandingkan kuantitas atau nominal antar-entitas yang independen satu sama lain.
# Data performa penjualan per divisi produk
divisi = ['Elektronik', 'Pakaian', 'Kebutuhan Rumah', 'Otomotif', 'Buku']
omset = [320, 215, 180, 95, 60] # Dalam jutaan rupiah
fig, ax = plt.subplots(figsize=(8, 5))
# Membuat diagram batang dengan warna kustom
warna_batang = ['#2563eb', '#38bdf8', '#10b981', '#f59e0b', '#ef4444']
bars = ax.bar(divisi, omset, color=warna_batang, width=0.6)
# Memberikan label nilai di atas setiap batang secara dinamis
for bar in bars:
tinggi = bar.get_height()
ax.annotate(f'{tinggi}M',
xy=(bar.get_x() + bar.get_width() / 2, tinggi),
xytext=(0, 4), # offset 4 point ke atas
textcoords="offset points",
ha='center', va='bottom', fontsize=10, fontweight='bold')
ax.set_title('Realisasi Pendapatan per Divisi Bisnis (Q1 2026)', fontsize=13, fontweight='bold')
ax.set_xlabel('Divisi Bisnis', fontsize=11)
ax.set_ylabel('Total Pendapatan (Miliar IDR)', fontsize=11)
ax.set_ylim(0, 360)
ax.grid(axis='y', linestyle='--', alpha=0.5)
plt.show()
Output:
(Grafik Diagram Batang ditampilkan: Lima batang vertikal dengan warna berbeda
dan label teks angka pendapatan terpampang tepat di atas masing-masing puncak batang)
4. Membuat Bar Chart Horizontal untuk Label yang Panjang
Jika nama kategori produk cukup panjang, diagram batang horizontal (ax.barh) jauh lebih mudah dibaca dibandingkan batang vertikal karena mata pembaca tidak perlu memiringkan kepala.
fitur_aplikasi = [
'Checkout Satu Klik',
'Integrasi QRIS Dinamis',
'Rekomendasi Berbasis AI',
'Fitur Chat Penjual Realtime',
'Pelacakan Kurir Terintegrasi'
]
skor_kepuasan = [4.8, 4.6, 4.3, 3.9, 3.5] # Skala 1 - 5
fig, ax = plt.subplots(figsize=(8, 4.5))
# Bar horizontal menggunakan barh
y_pos = np.arange(len(fitur_aplikasi))
ax.barh(y_pos, skor_kepuasan, color='#0d9488', height=0.55)
ax.set_yticks(y_pos)
ax.set_yticklabels(fitur_aplikasi, fontsize=10)
ax.invert_yaxis() # Membalik urutan agar peringkat pertama ada di baris teratas
ax.set_xlabel('Skor Kepuasan Pengguna (Skala 1 - 5)', fontsize=11)
ax.set_title('Evaluasi Fitur Aplikasi Berdasarkan Respon Pengguna', fontsize=12, fontweight='bold')
ax.set_xlim(0, 5.0)
ax.grid(axis='x', linestyle=':', alpha=0.6)
plt.show()
Output:
(Grafik Horizontal Bar ditampilkan dengan rapi tanpa label teks yang bertumpuk)
5. Membuat Multi-Plot (Subplots) dan Menyimpan Gambar ke Disk
Dalam laporan analitis formal, kita kerap menyandingkan dua grafik berdampingan:
# Membuat kanvas dengan 1 baris dan 2 kolom grafik
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(14, 5))
# Plot pertama: Line plot di ax1
ax1.plot(bulan[:6], penjualan_2026[:6], color='#16a34a', marker='o')
ax1.set_title('Tren Semester 1 (2026)')
ax1.set_ylabel('Juta Rupiah')
ax1.grid(True, linestyle=':')
# Plot kedua: Bar chart di ax2
ax2.bar(divisi[:3], omset[:3], color='#6366f1')
ax2.set_title('Top 3 Kontributor Divisi')
ax2.grid(axis='y', linestyle=':')
# Menyesuaikan jarak antar subplot secara otomatis agar tidak bertumpuk
plt.tight_layout()
# Menyimpan hasil visualisasi ke berkas gambar (PNG berkualitas tinggi 300 DPI)
fig.savefig('laporan_kinerja_penjualan.png', dpi=300, bbox_inches='tight')
print("Grafik berhasil disimpan sebagai 'laporan_kinerja_penjualan.png'.")
Output:
Grafik berhasil disimpan sebagai 'laporan_kinerja_penjualan.png'.
Argumen bbox_inches='tight' memastikan label sumbu dan judul tidak terpotong saat kanvas dikonversi menjadi berkas gambar.
Coba sendiri
Tantang keterampilanmu langsung di Google Colab dengan instruksi berikut:
- Buatlah array NumPy berisi 50 titik angka dengan
np.linspace(0, 10, 50). - Hitung nilai sinus (
np.sin(x)) dan nilai kosinus (np.cos(x)). - Buatlah kanvas Figure dengan dua subplot bertumpuk secara vertikal (
nrows=2, ncols=1). - Gambar gelombang sinus pada Axes pertama dengan garis putus-putus warna merah (
color='crimson', linestyle='--'). - Gambar gelombang kosinus pada Axes kedua dengan garis solid warna biru gelap (
color='navy'). - Tambahkan judul dan label sumbu pada kedua Axes, lalu gunakan
plt.tight_layout()agar kedua grafik terlihat rapi tanpa saling berbenturan!
Kesalahan yang sering terjadi
Berikut beberapa kesalahan umum saat mengoperasikan Matplotlib dan cara mengatasinya:
| Kesalahan Pemula | Dampak / Gejala | Solusi Benar |
|---|---|---|
Mencampur sintaks plt.title() dengan objek ax.set_title(). |
Teks judul salah penempatan atau muncul peringatan AttributeError. | Gunakan metode set_* saat memakai Axes: ax.set_title(), ax.set_xlabel(), ax.set_ylabel(). |
| Label pada sumbu X saling bertumpuk dan tidak terbaca. | Kategori teks panjang saling menimpa secara horizontal. | Rotasi label dengan plt.xticks(rotation=45) atau ax.tick_params(axis='x', rotation=45), atau ganti ke barh(). |
| Gambar hasil ekspor terpotong label atau legendanya. | File PNG yang dihasilkan via plt.savefig() kehilangan teks di bagian tepi. |
Selalu sertakan parameter bbox_inches='tight' pada fungsi fig.savefig(...). |
Menjalankan plt.savefig() setelah memanggil plt.show(). |
Berkas gambar yang tersimpan berwarna putih kosong (blank). | Panggil plt.savefig() sebelum plt.show(), karena show() mengosongkan kanvas memori aktif. |
Lupa memanggil plt.tight_layout(). |
Judul subplot kedua menabrak label sumbu X dari subplot pertama. | Selalu panggil plt.tight_layout() sebelum menampilkan atau menyimpan grafik multi-plot. |
Kaitannya dengan Praktik Industri / AI: Dalam alur kerja Deep Learning dan Machine Learning, Matplotlib adalah alat diagnostik utama untuk memantau proses pelatihan model (training curves). Para insinyur AI memplot kurva Training Loss vs Validation Loss di setiap epoch untuk mendeteksi apakah model sedang mengalami kondisi Overfitting (loss validasi mulai naik sementara loss latih terus turun) atau Underfitting. Selain itu, visualisasi arsitektur saraf tiruan, filter konvolusi pada Computer Vision, dan kurva batas keputusan (decision boundary) semuanya digambar menggunakan primitif kanvas Matplotlib.
Latihan
Uji kemahiran visualisasimu dengan mengerjakan 3 soal analisis mandiri berikut:
- Latihan 1: Diketahui data pengeluaran operasional mingguan (dalam juta rupiah): Minggu 1 = 12, Minggu 2 = 15, Minggu 3 = 14, Minggu 4 = 18, Minggu 5 = 22. Buatlah Line Plot dengan warna garis ungu (
#8b5cf6), penanda berupa segitiga (marker='^'), tebal garis 2, serta sertakan judul dan label sumbu yang informatif. - Latihan 2: Sebuah toko swalayan memiliki data jumlah pengunjung harian: Senin = 350, Selasa = 420, Rabu = 400, Kamis = 460, Jumat = 600, Sabtu = 850, Minggu = 900. Buatlah diagram batang vertikal. Berikan warna khusus merah bata (
#ef4444) untuk hari akhir pekan (Sabtu dan Minggu) dan warna abu-abu netral (#94a3b8) untuk hari kerja (Senin s.d. Jumat). - Latihan 3: Buatlah visualisasi komparatif multi-garis (multi-line plot) dalam satu Axes yang membandingkan performa suhu harian rata-rata di dua kota (misalnya Bandung dan Surabaya) selama 7 hari berturut-turut. Lengkapi grafik dengan legenda pembeda, grid putus-putus, dan titik marker lingkaran.
Kunci jawaban dan pembahasan
Berikut solusi kode lengkap untuk ketiga latihan di atas:
Solusi Latihan 1: Line Plot Kustom dengan Marker Segitiga
# Data pengeluaran operasional
minggu = [f'Minggu {i}' for i in range(1, 6)]
biaya = [12, 15, 14, 18, 22]
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(minggu, biaya, color='#8b5cf6', marker='^', markersize=8, linewidth=2, linestyle='-')
ax.set_title('Pertumbuhan Biaya Operasional Mingguan', fontsize=12, fontweight='bold')
ax.set_xlabel('Periode Operasional')
ax.set_ylabel('Pengeluaran (Juta Rupiah)')
ax.set_ylim(10, 25)
ax.grid(True, linestyle=':', alpha=0.7)
plt.show()
Pembahasan:
Parameter marker='^' menghasilkan penanda berbentuk segitiga lancip di setiap titik data minggu, sementara markersize=8 memperjelas ukuran visual titik tersebut. Pembatasan rentang sumbu Y dengan set_ylim(10, 25) memberikan ruang bernapas yang cukup di bagian atas dan bawah grafik.
Solusi Latihan 2: Bar Chart Kondisional Hari Kerja vs Akhir Pekan
hari = ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu', 'Minggu']
pengunjung = [350, 420, 400, 460, 600, 850, 900]
# Penentuan warna bersyarat: merah untuk weekend, abu-abu untuk weekday
warna_hari = ['#94a3b8' if h not in ['Sabtu', 'Minggu'] else '#ef4444' for h in hari]
fig, ax = plt.subplots(figsize=(8, 4.5))
ax.bar(hari, pengunjung, color=warna_hari, width=0.6)
ax.set_title('Distribusi Kunjungan Toko Harian: Weekday vs Weekend', fontsize=12, fontweight='bold')
ax.set_xlabel('Hari')
ax.set_ylabel('Jumlah Pengunjung')
ax.grid(axis='y', linestyle='--', alpha=0.5)
plt.show()
Pembahasan: Dengan memanfaatkan list comprehension Python untuk menentukan daftar warna berdasarkan nama hari, kita dapat langsung menarik perhatian audiens bahwa akhir pekan menghasilkan lonjakan pengunjung yang signifikan tanpa perlu menambahkan penjelasan teks yang bertele-tele.
Solusi Latihan 3: Multi-Line Plot Komparasi Suhu
hari_ke = [f'Hari {i}' for i in range(1, 8)]
suhu_bandung = [23.5, 24.0, 23.0, 22.5, 23.8, 24.2, 23.1]
suhu_surabaya = [32.0, 32.5, 33.1, 31.8, 33.0, 33.5, 32.8]
fig, ax = plt.subplots(figsize=(9, 4.5))
ax.plot(hari_ke, suhu_bandung, marker='o', color='#3b82f6', label='Bandung (Dataran Tinggi)')
ax.plot(hari_ke, suhu_surabaya, marker='s', color='#f97316', label='Surabaya (Pesisir)')
ax.set_title('Perbandingan Suhu Rata-Rata Harian (7 Hari)', fontsize=12, fontweight='bold')
ax.set_xlabel('Hari Pemantauan')
ax.set_ylabel('Suhu (°C)')
ax.grid(True, linestyle='--', alpha=0.5)
ax.legend(loc='center right')
plt.show()
Pembahasan:
Kedua pemanggilan ax.plot ditujukan pada objek ax yang sama. Matplotlib secara otomatis menyesuaikan rentang sumbu Y agar mencakup nilai minimum Bandung (22.5°C) hingga nilai tertinggi Surabaya (33.5°C), dan memunculkan legenda pembeda dengan label lokasi masing-masing.



Diskusi (0)
Kami menyimpan nama (opsional), komentar, dan hash teknis (bukan alamat IP asli) untuk mencegah spam. Cookie fungsional dipakai agar Anda dapat mengedit atau menghapus komentar sendiri dari browser ini. Untuk permintaan penghapusan, gunakan halaman kontak.
Belum ada komentar. Mulai diskusinya.