TL;DR
Matplotlib adalah library visualisasi data Python yang dipakai buat bikin grafik statis kayak line chart, bar chart, histogram, sampai boxplot. Cara pakainya lewat dua gaya: pyplot yang ringkas buat grafik cepat, dan gaya object-oriented pakai fig dan ax yang lebih rapi buat grafik bertingkat. Dari ratusan fungsi yang ada, 12 jenis grafik sudah cukup buat mayoritas kerjaan analis data harian.
Matplotlib adalah library Python buat bikin grafik statis, mulai dari line chart sederhana sampai panel grafik bertingkat yang siap masuk laporan.
Library ini udah ada sejak 2003 dan masih jadi dasar dari hampir semua tool visualisasi Python lain, termasuk pandas dan Seaborn.
Masalahnya, dokumentasinya luas banget. Ada ratusan fungsi, dan pemula gampang tenggelam di situ. Padahal kerjaan analis harian cuma butuh belasan pola yang sama, berulang-ulang.
Di bawah ini 12 grafik yang paling sering aku pakai, lengkap kodenya, plus catatan kapan grafik itu cocok dan kapan lebih baik ganti.
Matplotlib adalah library visualisasi data Python yang ngubah angka jadi gambar grafik. Kamu kasih data dalam bentuk list, array, atau kolom DataFrame, lalu Matplotlib gambar sumbu, garis, batang, dan labelnya. Hasilnya bisa disimpan jadi PNG, SVG, atau PDF buat laporan.
Alasan dia masih dipakai setelah dua dekade: kontrolnya detail sampai level piksel. Mau geser posisi legenda 3 milimeter? Bisa. Mau ganti font satu label doang? Bisa.
Tool lain lebih cepat buat grafik standar, tapi begitu ada permintaan aneh dari atasan, Matplotlib yang bisa nurut.
Install lewat pip dari terminal. Satu baris, dan sebaiknya dijalankan di dalam virtual environment biar versi library-nya nggak tabrakan sama proyek lain.
pip install matplotlib pandas
Aku selalu install pandas barengan, soalnya data yang mau digambar hampir selalu datang dari DataFrame. Kalau kamu belum kenal cara misahin environment per proyek, baca dulu panduan virtual environment Python untuk analis.
Setelah itu, impor modul pyplot dengan alias standar:
import matplotlib.pyplot as plt
import pandas as pd
print(plt.matplotlib.__version__)
Ada dua cara nulis kode Matplotlib. Gaya pyplot manggil perintah langsung ke plt, cocok buat grafik cepat sekali pakai. Gaya object-oriented bikin objek fig dan ax dulu, lalu semua perintah ditempel ke ax. Gaya kedua lebih panjang tapi jauh lebih rapi begitu grafikmu punya lebih dari satu panel.
# Gaya pyplot
plt.plot([1, 2, 3], [10, 20, 15])
plt.title("Cepat")
plt.show()
# Gaya object-oriented
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot([1, 2, 3], [10, 20, 15])
ax.set_title("Rapi")
plt.show()
Saran aku: pakai gaya kedua sejak awal. Dokumentasi resmi Matplotlib juga merekomendasikan gaya object-oriented buat kode yang bakal dipakai ulang.
Dua belas grafik ini nutup mayoritas kebutuhan laporan: tren waktu, perbandingan kategori, sebaran nilai, hubungan dua variabel, dan komposisi. Semua contoh di bawah pakai data penjualan toko_berkah, dataset latihan ngulikdata berisi transaksi ritel harian.
data = pd.DataFrame({
"bulan": ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun"],
"omzet": [42_500_000, 38_900_000, 51_200_000, 47_800_000, 63_400_000, 58_100_000],
"transaksi": [612, 548, 703, 661, 845, 792],
})
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(data["bulan"], data["omzet"], marker="o", color="#0891b2")
ax.set_title("Omzet toko_berkah per bulan")
ax.set_ylabel("Rupiah")
plt.show()
Pakai marker="o" kalau titik datanya sedikit. Di bawah 12 titik, penanda bulat bikin pembaca gampang baca nilai per periode.
ax.bar(data["bulan"], data["omzet"], color="#0891b2")
Bar chart wajib mulai dari nol. Kalau sumbu Y dipotong, selisih batang jadi kelihatan lebih besar dari kenyataan.
produk = ["Beras 5kg", "Minyak goreng 2L", "Gula pasir 1kg", "Telur 1kg"]
terjual = [1240, 980, 870, 1510]
fig, ax = plt.subplots(figsize=(8, 4))
ax.barh(produk, terjual, color="#f97316")
ax.set_xlabel("Unit terjual")
plt.show()
Begitu nama kategorinya lebih dari 10 huruf, ganti ke barh. Label miring 45 derajat itu bikin pembaca miringin kepala.
import numpy as np
x = np.arange(len(data))
lebar = 0.38
fig, ax = plt.subplots(figsize=(9, 4))
ax.bar(x - lebar/2, data["omzet"]/1e6, lebar, label="2025", color="#0891b2")
ax.bar(x + lebar/2, data["omzet"]/1e6 * 0.82, lebar, label="2024", color="#fbbf24")
ax.set_xticks(x, data["bulan"])
ax.legend()
plt.show()
ax.bar(data["bulan"], sembako, label="Sembako", color="#0891b2")
ax.bar(data["bulan"], nonsembako, bottom=sembako, label="Non sembako", color="#f97316")
Kuncinya parameter bottom. Batang kedua ditumpuk di atas yang pertama.
ax.pie([48, 27, 15, 10],
labels=["Sembako", "Minuman", "Snack", "Lainnya"],
autopct="%1.0f%%")
Pie cuma enak dibaca kalau potongannya maksimal 4 dan selisihnya jelas. Lima potongan ke atas, ganti ke bar chart.
ax.hist(nilai_transaksi, bins=30, color="#0891b2", edgecolor="white")
ax.set_xlabel("Nilai transaksi (Rp)")
Jumlah bins ngubah cerita. Coba 20, 30, dan 50 sebelum ambil kesimpulan soal bentuk sebarannya.
ax.scatter(data["transaksi"], data["omzet"]/1e6,
s=70, alpha=0.7, color="#f97316")
Parameter alpha bikin titik semi transparan. Berguna kalau titiknya ratusan dan saling numpuk.
ax.boxplot([cabang_a, cabang_b, cabang_c],
tick_labels=["Depok", "Bekasi", "Bogor"])
Titik di luar garis kumis itu kandidat outlier. Cek dulu sebelum dibuang, kadang itu transaksi grosir yang beneran terjadi.
ax.fill_between(data["bulan"], data["omzet"]/1e6,
alpha=0.35, color="#0891b2")
ax.plot(data["bulan"], data["omzet"]/1e6, color="#0891b2")
fig, axes = plt.subplots(2, 2, figsize=(10, 6), sharey=True)
for ax, (nama, df) in zip(axes.flat, cabang.items()):
ax.plot(df["bulan"], df["omzet"], color="#0891b2")
ax.set_title(nama)
fig.tight_layout()
Parameter sharey bikin semua panel pakai skala Y yang sama. Tanpa itu, perbandingan antar panel jadi menyesatkan.
fig, ax1 = plt.subplots(figsize=(9, 4))
ax1.bar(data["bulan"], data["omzet"]/1e6, color="#0891b2")
ax1.set_ylabel("Omzet (juta Rp)")
ax2 = ax1.twinx()
ax2.plot(data["bulan"], data["transaksi"], color="#f97316", marker="o")
ax2.set_ylabel("Jumlah transaksi")
plt.show()
Pakai twinx cuma kalau dua metric itu memang saling menjelaskan. Dua sumbu berbeda gampang dipakai buat manipulasi kesan.
Dari dataset toko_berkah, omzet Juni tercatat Rp 58,1 juta, turun 8,4 persen dari puncak Mei di Rp 63,4 juta. Kalau cuma lihat line chart omzet, kesimpulannya penjualan melemah.
Aku gambar ulang pakai twinx, omzet jadi batang dan jumlah transaksi jadi garis. Transaksi Juni cuma turun 6,3 persen, dari 845 ke 792.
Artinya nilai belanja rata-rata per transaksi ikut turun tipis, dari Rp 75.030 ke Rp 73.359. Selisihnya cuma Rp 1.671 per struk, jadi masalah utamanya bukan harga, tapi jumlah orang yang datang.
Satu grafik tambahan ngubah rekomendasi dari "naikkan harga" jadi "kejar traffic pengunjung". Itu gunanya milih jenis grafik dengan sadar.
Matplotlib dulu. Seaborn dibangun di atas Matplotlib, jadi tiap kali kamu mau ganti judul, ukuran font, atau warna, kamu tetap balik ke perintah Matplotlib. Kalau dasarnya paham, belajar Seaborn cuma butuh sore hari.
Karena kamu belum manggil plt.show(). Di Jupyter grafik muncul otomatis, tapi di script biasa Matplotlib nunggu perintah itu. Kalau jalan di server tanpa layar, pakai plt.savefig("grafik.png") buat simpan hasilnya jadi file.
Simpan pakai plt.savefig("grafik.png", dpi=300, bbox_inches="tight"). Angka 300 bikin gambar tajam pas dicetak. Buat dokumen yang sering di-zoom, simpan versi vektor pakai ekstensi .svg atau .pdf.
Maksimal 5 sampai 6 kategori. Lebih dari itu pembaca capek bolak-balik ke legenda. Kelompokkan kategori kecil jadi satu "Lainnya", atau pecah jadi panel kecil pakai plt.subplots.
Terbatas. Di Jupyter ada mode widget buat zoom dan geser. Kalau kamu butuh grafik yang bisa diklik dan ditaruh di web, Plotly lebih cocok. Matplotlib paling kuat buat grafik statis di laporan PDF dan slide.
Tiga hal yang paling ngefek dari tutorial ini: pakai gaya fig dan ax sejak awal, pilih jenis grafik berdasarkan pertanyaan bisnisnya, dan selalu cek apakah sumbu Y-mu jujur.
Kalau datamu masih di file Excel, mulai dari cara baca file Excel di Python dulu, baru masuk ke grafik.
Buat yang lebih nyaman ngolah angka di spreadsheet sebelum masuk Python, latihan fungsi dasar kayak AVERAGE dan SUMIFS di NgulikSheet bisa mempercepat tahap persiapan datanya.
Coba ambil satu file penjualan yang kamu punya, gambar tiga grafik dari daftar di atas, dan lihat mana yang paling cepat jawab pertanyaan bosmu.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Kolom datetime nyimpen tanggal, jam, hari, semuanya nempel jadi satu. Accessor .dt di pandas ngeluarin tiap bagian jadi kolom sendiri buat dianalisa.
Nama toko ketik campur huruf besar-kecil, spasi nyasar di ujung, atau kode produk nempel jadi satu. Accessor .str di pandas ngerapiin semua itu tanpa loop.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.