Esensial Matplotlib

Figure, axis, label, dan layout untuk grafik yang dapat dibaca.

Daftar isi

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.

python esensial_matplotlib.py
"""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())
text Keluaran
tersimpan: dua-panel-matplotlib.png
rata-rata: {'Stasiun A': 34.3, 'Stasiun B': 55.4}

Dua panel matplotlib
Dua panel matplotlib

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 pada ax yang dimaksud.
  • Grafik lengkap membawa judul, label bersatuan, legenda bila perlu, ukuran teks yang terbaca, dan batas sumbu yang jujur.
  • figsize dengan constrained_layout menata ukuran dan jarak tanpa penyesuaian tangan.
  • fig.savefig menyimpan grafik ke berkas dan berjalan di lingkungan tanpa layar, dan warna antar grafik dijaga konsisten.

Referensi#