Sepanjang Section ini kita memanggil plt.subplots(), ax.set_title(), dan plt.show() tanpa pernah membedahnya — seperti memakai dapur orang lain tanpa tahu letak pancinya. Padahal matplotlib adalah fondasi seluruh visualisasi Python: seaborn, pandas plot, bahkan geopandas semuanya membangun di atasnya. Pada chapter ini kita buka dapur itu: memahami anatomi figure dan axes, membandingkan dua gaya penulisannya, membangun satu grafik utuh dari nol langkah demi langkah, lalu menutup dengan mengatur warna dan menyimpan gambar ke berkas.

Anatomi Gambar: Figure, Axes, dan Axis #

Tiga istilah ini menjadi sumber kebingungan klasik karena namanya mirip. Figure adalah kertas gambar — kanvas paling luar yang menampung segalanya. Axes adalah satu bidang gambar dengan sumbunya; inilah yang kita maksud dengan “sebuah grafik”. Axis (tanpa -es) adalah garis sumbu tunggal beserta tanda dan labelnya. Sebuah figure boleh memuat banyak axes — itulah yang terjadi setiap kali kita memakai subplots:

text
figure   (kertas gambar)
└─ axes  (satu bidang gambar; inilah "satu grafik")
   ├─ x-axis  (garis sumbu mendatar: tick, label, batas)
   ├─ y-axis  (garis sumbu tegak: tick, label, batas)
   └─ artist  (semua yang tergambar: garis, batang, titik, teks)

Ketiganya punya pintu masuk yang berbeda di kode:

IstilahCara membuat / mengaksesContoh method yang melekat
figurehasil kedua plt.subplots(); ukurannya diatur figsizefig.savefig(), fig.suptitle(), fig.tight_layout()
axeshasil pertama plt.subplots(), kebiasaan kita menamainya axax.plot(), ax.set_title(), ax.set_xlabel(), ax.legend()
axislewat axes: ax.xaxis dan ax.yaxisax.tick_params() mengatur keduanya sekaligus
artistnilai balik fungsi gambar (Line2D, BarContainer)ax.containers[0] untuk bar_label()

Membedakan figure dan axes menjadi penting begitu grafik kita berpanel banyak: fig.suptitle() menulis judul untuk seluruh kertas, sedangkan ax.set_title() menulis judul untuk satu bidang — kita memakai keduanya sekaligus pada pola small multiples di chapter Visualisasi Multivariabel.

Dua Gaya Penulisan: pyplot dan Object-Oriented #

matplotlib menyediakan dua pintu untuk pekerjaan yang sama. Gaya pyplot menulis segalanya lewat modul plt dan membiarkan matplotlib mengelola figure serta axes secara otomatis:

python
import matplotlib.pyplot as plt

hari = ["Senin", "Selasa", "Rabu", "Kamis", "Jumat"]
gelas = [26, 24, 28, 31, 35]

plt.bar(hari, gelas, color="tab:blue")
plt.title("Es Kopi Susu Sepekan")
plt.ylabel("Gelas terjual")
plt.show()

Lima baris itu menghasilkan lima batang tegak: 26, 24, 28, 31, dan 35 gelas dari Senin sampai Jumat, dengan judul di atas dan label sumbu tegak di samping. Di belakang layar, plt.bar() diam-diam membuat satu figure dan satu axes bila belum ada, lalu plt.title() dan plt.ylabel() menulis pada bidang aktif itu — bidang yang sedang dikerjakan terakhir kali.

Gaya object-oriented (OO) membuat kedua objek itu eksplisit: fig, ax = plt.subplots(), lalu seluruh pekerjaan dilakukan pada ax. Perbedaan praktisnya:

AspekGaya pyplotGaya object-oriented
Penulisanplt.bar(...), plt.title(...)ax.bar(...), ax.set_title(...)
Objektersembunyi (bidang aktif)eksplisit (fig, ax di tangan kita)
Grafik tunggal cepatsangat ringkassedikit lebih panjang
Grafik berpanel banyakmudah tertukar bidang aktiftiap panel punya variabelnya sendiri
Dipakai olehcontoh singkat dokumentasihampir seluruh kode produksi dan seaborn

Karena seluruh chapter praktik kita memakai panel, loop, dan sumbu bersama, kita memakai gaya OO secara konsisten — dan sepanjang sisa chapter ini kita bangun satu grafik utuh dengannya.

Membangun Satu Grafik Utuh dari Nol #

Bahan bacannya: penjualan dua menu favorit Toko Kopi Kita selama delapan pekan awal tahun 2026. Kita susun grafiknya langkah demi langkah:

python
import matplotlib.pyplot as plt

pekan = ["6 Jan", "13 Jan", "20 Jan", "27 Jan",
         "3 Feb", "10 Feb", "17 Feb", "24 Feb"]
es_kopi_susu = [118, 125, 121, 132, 140, 148, 152, 160]
matcha_latte = [64, 61, 58, 66, 71, 75, 73, 78]

fig, ax = plt.subplots(figsize=(7, 3.5))
ax.plot(pekan, es_kopi_susu, marker="o", color="tab:blue",
        label="es kopi susu")
ax.plot(pekan, matcha_latte, marker="s", color="tab:green",
        label="matcha latte")
ax.set_title("Penjualan Dua Menu Selama Delapan Pekan")
ax.set_xlabel("Awal pekan")
ax.set_ylabel("Gelas terjual")
ax.set_ylim(0, 180)
ax.grid(True)
ax.tick_params(axis="x", labelrotation=30)
ax.legend()
plt.show()

Gambar yang dihasilkan memuat dua garis yang sama-sama menanjak dari kiri ke kanan: garis biru berpenanda lingkaran (es kopi susu) naik dari 118 ke 160 gelas dengan sempat menurun ke 121 di pekan ketiga, sedangkan garis hijau berpenanda kotak (matcha latte) bergerak lebih landai dari 64 ke 78 dengan sempat turun ke 58 di pekan ketiga. Label pekan miring 30 derajat agar tidak saling menindih, dan legend di dalam bidang membedakan kedua garis.

Mari kita bedah baris-barisnya:

  1. Baris 8 (fig, ax = plt.subplots(figsize=(7, 3.5))): satu figure dan satu axes dibuat sekaligus; figsize dalam inci menentukan perbandingan lebar-tinggi kertas — 7×3,5 inci menghasilkan grafik lebar yang nyaman untuk delapan titik waktu.
  2. Baris 9-12 (dua ax.plot(...)): tiap menu jadi satu panggilan; marker menambahkan penanda nilai, color menentukan warna garis, dan label mendaftarkan teks untuk legend — legend tidak bisa menebak nama seri tanpa argumen ini.
  3. Baris 13-15 (set_title, set_xlabel, set_ylabel): judul menyebut konteks (menu, periode), label sumbu menyebut satuan “gelas” — dua syarat grafik yang berdiri sendiri dari chapter Prinsip Visualisasi.
  4. Baris 16 (set_ylim(0, 180)): batas sumbu tegak ditetapkan dari 0 sampai 180 agar kedua garis memiliki ruang di atas titik tertinggi tanpa memangkas nol.
  5. Baris 18 (tick_params(axis="x", labelrotation=30)): satu panggilan untuk mengatur kedua sumbu sekaligus — di sini hanya sumbu x yang diputar 30 derajat karena delapan label tanggal berhimpit bila ditulis tegak.
  6. Baris 19 (ax.legend()): mengumpulkan seluruh label yang terdaftar dan menggambarnya; tanpa panggilan ini, legend tidak muncul meski setiap seri sudah berlabel.

Mengatur Warna #

Argumen color= (boleh disingkat c=) menerima tiga bentuk penulisan. Bentuk pertama, nama warna: dari palet bawaan "tab:..." untuk kategori, nama CSS seperti "teal" dan "crimson", sampai satu huruf "b", "k", "r". Kedua, kode hex seperti "#1f77b4" — bentuk yang dipakai saat warna harus persis sama dengan identitas merek. Ketiga, pasangan RGB seperti (0.12, 0.47, 0.71). Ketiganya saling terjemahkan, dan matplotlib menyediakan fungsi untuk membuktikannya:

python
import matplotlib.colors as mcolors

for nama in ["tab:blue", "tab:orange", "tab:green", "tab:red", "b", "k"]:
    print(f"{nama:12s} -> {mcolors.to_hex(nama)}")

Output yang Dihasilkan:

text
tab:blue     -> #1f77b4
tab:orange   -> #ff7f0e
tab:green    -> #2ca02c
tab:red      -> #d62728
b            -> #0000ff
k            -> #000000

Enam nama warna dicetak kode hex-nya: palet tab: memuat warna-warna yang sengaja dipilih agar dapat dibedakan satu sama lain — itulah alasan kita memakainya untuk kategori sepanjang Section ini — sedangkan singkatan satu huruf "b" dan "k" berarti biru dan hitam murni. Dua kerabat color yang sering kita pakai: edgecolor untuk garis tepi batang dan titik, serta alpha untuk transparansi yang kita bahas tuntas pada chapter Scatter Plot.

Menyimpan Gambar: savefig vs show #

plt.show() dan fig.savefig() menutup dua peran visualisasi dari chapter pertama Section ini. show() membuka jendela tampilan di layar — peran eksplorasi, melihat hasil sambil mengubah kode. savefig() menuliskan kertas gambar ke berkas di penyimpanan — peran komunikasi, bahan laporan dan presentasi. Dua argumennya yang terpenting: dpi mengatur kepadatan titik per inci (150 sudah tajam untuk laporan), dan bbox_inches="tight" memangkas ruang kosong di pinggir sehingga judul dan label tidak terpotong:

python
import tempfile
from pathlib import Path

import matplotlib.pyplot as plt

pekan = ["6 Jan", "13 Jan", "20 Jan", "27 Jan",
         "3 Feb", "10 Feb", "17 Feb", "24 Feb"]
es_kopi_susu = [118, 125, 121, 132, 140, 148, 152, 160]

fig, ax = plt.subplots(figsize=(7, 3.5))
ax.plot(pekan, es_kopi_susu, marker="o", color="tab:blue",
        label="es kopi susu")
ax.set_title("Penjualan Es Kopi Susu Selama Delapan Pekan")
ax.set_xlabel("Awal pekan")
ax.set_ylabel("Gelas terjual")
ax.grid(True)
ax.legend()

with tempfile.TemporaryDirectory() as folder:
    berkas = Path(folder) / "penjualan.png"
    fig.savefig(berkas, dpi=150, bbox_inches="tight")

plt.show()

Blok ini membangun grafik garis yang sama dengan contoh utuh sebelumnya, lalu menyimpannya sebagai penjualan.png pada 150 dpi dengan pinggiran rapat, dan terakhir menampilkannya. Folder sementara (tempfile.TemporaryDirectory()) dipakai agar contoh ini tidak meninggalkan berkas di komputer Anda — pada pemakaian sungguhan, cukup tuliskan fig.savefig("penjualan.png", dpi=150, bbox_inches="tight") dengan nama berkas sungguhan.

Rangkuman #

  • Figure adalah kertas gambar, axes adalah satu bidang grafik, axis adalah satu garis sumbu — plt.subplots() mengembalikan figure dan axes, dan hampir semua pekerjaan melekat pada ax.
  • Gaya pyplot menulis lewat plt pada bidang aktif yang tersembunyi; gaya object-oriented memegang fig dan ax secara eksplisit dan unggul begitu grafik berpanel banyak.
  • Grafik utuh yang berdiri sendiri memuat: figsize, penanda dan label per seri, set_title yang menyebut konteks, label sumbu bersatuan, batas sumbu, tick_params, dan legend.
  • Warna diterima dalam tiga bentuk — nama, hex, RGB — dengan palet tab: sebagai pilihan baku untuk kategori.
  • plt.show() untuk melihat di layar, fig.savefig(..., dpi=..., bbox_inches="tight") untuk menyimpan berkas — dan simpan lebih dulu sebelum menampilkan.

Dengan dapur matplotlib kini dikuasai, kita siap bertemu lapisan yang berdiri di atasnya. seaborn mengambil figur, axes, dan method yang sama, lalu menambahkan satu bahan penyederhana: DataFrame. Bagaimana sebuah library bisa memangkas dua puluh baris menjadi tiga, kita bahas pada chapter berikutnya, Visualisasi dengan Seaborn.

Referensi #

  1. Matplotlib — User’s Guide — panduan resmi lengkap, termasuk anatomi figure dan dua gaya API.
  2. Matplotlib — pyplot API Summary — daftar fungsi pyplot seperti subplots, savefig, dan show.
  3. Matplotlib — Gallery — galeri contoh resmi untuk melihat wujud tiap jenis grafik sebelum membuatnya.