Matplotlib adalah fondasi grafik pada ekosistem Python, dan esensialnya adalah dua objek, yaitu figure sebagai kanvas dan axes sebagai satu bidang gambarnya. Topik ini membangun kebiasaan kerja pada antarmuka berorientasi objek, mulai dari satu bidang, dua panel berdampingan, label yang lengkap, sampai batas sumbu yang jujur. Setelah membacanya, grafik yang dihasilkan memiliki semua bagian yang dibutuhkan pembaca dan dapat disimpan dalam satu baris.
Figure dan axes sebagai dua objek#
Pola kerja yang disarankan dokumentasi resmi adalah antarmuka berorientasi
objek, yaitu fig, ax = plt.subplots() yang mengembalikan kanvas dan bidang
gambarnya sekaligus, lalu semua pengaturan ditujukan pada ax. Pola ini
berbeda dari antarmuka prosedural plt.plot yang bekerja pada bidang aktif
secara diam-diam, dan perbedaannya baru terasa ketika grafik memiliki lebih
dari satu panel.
Dua objek tersebut menjawab dua pertanyaan berbeda. Figure menyimpan hal yang berlaku untuk keseluruhan gambar, yaitu ukuran dan tata letaknya, sedangkan axes menyimpan data, label sumbu, judul, dan legenda milik satu panel. Dua panel berarti dua axes di dalam satu figure, dan pengaturan yang berbeda antar panel ditulis pada masing-masing.
Ukuran figure ditentukan dalam inci melalui figsize, dan argumen
constrained_layout mengatur jarak antar elemen secara otomatis tanpa
perlu penyesuaian tangan. Kombinasi keduanya menjadi baku pada seluruh
grafik jalur ini.
Dua panel dan kelengkapannya#
Grafik yang baik membawa lima kelengkapan, yaitu judul yang menyatakan temuannya, label kedua sumbu beserta satuannya, legenda bila ada lebih dari satu kelompok, ukuran teks yang terbaca, dan batas sumbu yang jujur. Skrip berikut menyusun dua panel berdampingan, yaitu garis sepanjang waktu dan batang rata-rata per stasiun, dengan semua kelengkapan itu.
"""Esensial matplotlib: figure, axes, label, dan layout dua panel."""
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import pandas as pd
data = pd.read_csv(
"ukuran_udara.csv",
na_values=["kosong", "-999.0"],
dtype={"pm25": "string", "kelembapan": "string"},
)
data["pm25"] = data["pm25"].astype("float")
data["waktu"] = pd.to_datetime(data["waktu"], format="mixed", dayfirst=True)
data["stasiun"] = (
data["stasiun"].str.strip().str.replace(r"\s+", " ", regex=True).str.title()
)
sah = data[data["pm25"] < 500]
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(7.6, 3.4), constrained_layout=True)
for stasiun, warna in [("Stasiun A", "#4c72b0"), ("Stasiun B", "#c44e52")]:
potong = sah[sah["stasiun"] == stasiun].sort_values("waktu")
ax1.plot(potong["waktu"], potong["pm25"], color=warna, label=stasiun)
ax1.set_title("PM2.5 sepanjang waktu")
ax1.set_ylabel("PM2.5")
ax1.tick_params(axis="x", rotation=45, labelsize=8)
ax1.legend(fontsize=8)
per_stasiun = sah.groupby("stasiun")["pm25"].mean()
ax2.bar(per_stasiun.index, per_stasiun.values,
color=["#4c72b0", "#c44e52"], width=0.5)
ax2.set_title("Rata-rata per stasiun")
ax2.set_ylabel("PM2.5")
ax2.set_ylim(0, 60) # batas penuh, bukan terpotong
fig.savefig("dua-panel-matplotlib.png", dpi=110)
print("tersimpan: dua-panel-matplotlib.png")
print("rata-rata:", per_stasiun.round(1).to_dict())tersimpan: dua-panel-matplotlib.png
rata-rata: {'Stasiun A': 34.3, 'Stasiun B': 55.4}
Panel garis memperlihatkan dua stasiun bergerak paralel dengan lonjakan bersama, sedangkan panel batang meringkasnya dengan sumbu yang dimulai dari nol. Angka pada keluaran, yaitu 34.3 berbanding 55.4, adalah nilai yang sama yang digambar panel kedua, sehingga grafik dan teks tidak pernah berbeda.
Menyimpan grafik dilakukan dengan fig.savefig sebelum atau tanpa
plt.show, dan format PNG dengan dpi yang cukup membuat grafik siap
ditempel ke laporan. Grafik untuk publikasi cetak dapat disimpan sebagai
SVG, dan keduanya berbagi kode yang persis sama.
Label, legenda, dan teks yang terbaca#
Label sumbu menyertakan satuan setiap kali ada satuan, karena angka tanpa satuan memaksa pembaca menebak maknanya. Judul panel menyatakan temuannya secara singkat, misalnya “Rata-rata per stasiun”, dan kategori pada sumbu dibiarkan berupa nama yang sudah dibersihkan pada modul pembersihan.
Legenda dipanggil hanya bila ada label yang diberikan pada geometri, dan
ukuran teksnya diturunkan bila grafik rapat. Tick yang bertumpuk pada sumbu
waktu dilapangkan dengan rotasi yang dikombinasikan ukuran font, dan pilihan
sekecil ini menentukan apakah grafik terbaca pada lebar kolom laporan.
Warna juga diperlakukan sebagai kelengkapan, bukan selera. Dua warna yang dipakai di seluruh jalur ini konsisten antar grafik, yaitu Stasiun A selalu biru dan Stasiun B selalu merah, sehingga pembaca yang berpindah grafik tidak perlu mempelajari ulang kodenya.
Kesalahan umum#
Kesalahan pertama adalah menggambar tanpa label sumbu. Grafiknya benar, tetapi pembacanya tidak dapat menyatakan apa yang dilihatnya, dan label yang menolong hanya butuh satu baris per sumbu.
Kesalahan kedua adalah mencampur dua antarmuka pada satu skrip, misalnya
plt.title untuk axes kedua di dalam layout multi-panel. Pengaturannya
mendarat pada bidang yang salah tanpa error, sedangkan menulis pada ax
yang dimaksud membuat sasarannya pasti.
Kesalahan ketiga adalah memanggil plt.show di dalam skrip tanpa layar,
sebagaimana lingkungan server, dan skripnya menggantung. Grafik yang ditulis
ke berkas dengan savefig berjalan di mana pun, dan backend non-grafis yang
diatur di awal skrip menegaskannya.
Ringkasan#
fig, ax = plt.subplots()mengembalikan kanvas dan bidang gambar, dan semua pengaturan ditulis padaaxyang dimaksud.- Grafik lengkap membawa judul, label bersatuan, legenda bila perlu, ukuran teks yang terbaca, dan batas sumbu yang jujur.
figsizedenganconstrained_layoutmenata ukuran dan jarak tanpa penyesuaian tangan.fig.savefigmenyimpan grafik ke berkas dan berjalan di lingkungan tanpa layar, dan warna antar grafik dijaga konsisten.
Referensi#
- Matplotlib Usage Guide — Matplotlib documentation — pengantar resmi figure, axes, dan dua antarmuka matplotlib.
- matplotlib.pyplot.subplots — Matplotlib documentation — rujukan resmi pembuatan panel beserta argumen layoutnya.