Topik ini menetapkan pola penulisan kode matplotlib yang digunakan pada seluruh jalur, yaitu antarmuka berorientasi objek (object-oriented interface) dengan objek fig dan ax yang dibuat secara eksplisit. Pembahasan membandingkannya dengan gaya implisit pyplot yang menyimpan state (keadaan program) global, lengkap dengan mekanisme state tersebut dan alasan gaya implisit sulit dipertahankan pada program yang berkembang. Seluruh contoh dijalankan penuh, dan gambar hasilnya disematkan di tempatnya.
Pola dasar fig dan ax#
Fungsi plt.subplots() membuat dan mengembalikan dua objek sekaligus, yaitu satu Figure dan satu Axes. Kedua objek biasanya disimpan pada variabel bernama fig dan ax, lalu seluruh pengubahan dilakukan melalui metode milik objek: fig.savefig() menulis berkas gambar, sedangkan ax.set_title(), ax.set_xlabel(), dan ax.plot() mengatur satu panel. Tidak ada keadaan tersembunyi yang menentukan sasaran perintah, karena setiap panggilan menyebut objek sasarannya secara langsung.
Skrip berikut membangun satu Figure berisi dua Axes, satu panel garis dan satu panel sebaran, dengan data sintetis lima ujian. Seluruh pembangunan dilakukan melalui metode ax.*, mulai dari penggambaran data hingga judul dan label sumbu. Jalankan skrip dari direktori topiknya, kemudian periksa berkas dua-panel.svg yang dihasilkannya.
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 2, figsize=(7, 3.5))
ax_garis, ax_sebaran = ax[0], ax[1]
ujian = [1, 2, 3, 4, 5]
nilai = [65, 72, 70, 78, 81]
ax_garis.plot(ujian, nilai, marker="o")
ax_garis.set_title("Perkembangan nilai ujian")
ax_garis.set_xlabel("Nomor ujian")
ax_garis.set_ylabel("Nilai")
ax_sebaran.scatter(ujian, nilai)
ax_sebaran.set_title("Sebaran nilai per ujian")
ax_sebaran.set_xlabel("Nomor ujian")
ax_sebaran.set_ylabel("Nilai")
fig.tight_layout()
fig.savefig("dua-panel.svg")
print("jumlah Axes pada figure :", len(fig.axes))
print("tipe fig :", type(fig))
print("tipe ax_garis :", type(ax_garis))jumlah Axes pada figure : 2
tipe fig : <class 'matplotlib.figure.Figure'>
tipe ax_garis : <class 'matplotlib.axes._axes.Axes'>Keluaran mengonfirmasi struktur yang dibangun: len(fig.axes) bernilai dua, dan tipe kedua variabel adalah Figure serta Axes. Panel kiri dan kanan pada gambar adalah dua objek Axes yang berdiri sendiri, masing-masing memiliki judul, label sumbu, dan skala sendiri. Mengubah panel satu tidak menyentuh panel dua karena keduanya adalah objek yang berbeda, dan kejelasan pemilahan objek inilah yang menjadi dasar penyusunan beberapa panel dalam satu figure.
Gaya implisit pyplot#
Gaya implisit adalah gaya penulisan yang memanggil fungsi langsung pada modul pyplot, seperti plt.plot() dan plt.title(). Fungsi-fungsi tersebut tidak menerima objek sasaran. Alih-alih menentukan sasaran, pyplot mencatat satu figure aktif dan satu Axes aktif pada variabel global, kemudian setiap fungsi tanpa sasaran bekerja pada pasangan aktif itu. Metode plt.gcf() (get current figure) mengembalikan figure aktif, sedangkan plt.gca() (get current axes) mengembalikan Axes aktif.
Dua perintah berikut memperlihatkan mekanismenya. Panggilan plt.plot() tanpa objek sasaran membuat Figure dan Axes baru secara otomatis, lalu plt.gcf() dan plt.gca() mengambil keduanya dari state global.
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [2, 4, 6]) # masuk ke figure dan Axes aktif
fig = plt.gcf() # figure aktif saat ini
ax = plt.gca() # Axes aktif saat iniPada skrip kecil satu panel, kedua gaya menghasilkan gambar yang sama persis. Perbedaannya bukan pada gambar, melainkan pada tempat keputusan sasaran disimpan: gaya implisit menyimpan keputusan itu pada state global, sedangkan gaya berorientasi objek menyimpannya pada nama variabel yang eksplisit. Dokumentasi resmi mendeskripsikan pyplot sebagai antarmuka berbasis state (state-based) yang ditujukan untuk penggambaran interaktif dan pembuatan grafik programatik yang sederhana.
Mengapa gaya implisit berhenti menskalakan#
State global bekerja dengan baik selama hanya ada satu figure dan satu alur kerja linier. Masalah muncul ketika program memuat beberapa figure, misalnya laporan dengan sepuluh panel yang dibuat dalam perulangan. Pada kondisi itu, plt.title() selalu menyasar figure dan Axes aktif terakhir, sehingga urutan pembuatan harus diingat dan fungsi harus dipanggil pada momen yang tepat. Kesalahan urutan sedikit saja sudah membuat judul berpindah ke panel yang salah tanpa pesan error.
Struktur program juga terpengaruh. Fungsi pembantu yang ditulis dengan gaya implisit tidak menerima parameter ax, sehingga fungsi tersebut harus mencari sendiri Axes aktif melalui plt.gca(). Fungsi semacam itu sulit diuji dan sulit dipindahkan, karena hasilnya bergantung pada keadaan global pada saat dipanggil. Padanan berorientasi objek menerima parameter ax dan menghasilkan keluaran yang sama untuk objek mana pun yang diberikan, sehingga perilakunya terbatas pada masukannya.
Karena itu, gaya implisit layak diposisikan sebagai jalan pintas untuk eksplorasi cepat di notebook, sedangkan kode yang digunakan ulang atau disusun menjadi laporan sebaiknya menerapkan gaya berorientasi objek. Aturan ini bukan soal selera, melainkan konsekuensi mekanisme: state global tidak memberi nama pada objek, dan objek tanpa nama tidak dapat dikirim sebagai parameter ke fungsi lain.
Kesalahan umum#
Kesalahan pertama adalah mencampur gaya dalam satu skrip, misalnya membangun dua panel dengan plt.subplots(1, 2) tetapi memberi judul melalui plt.title(). Penyebabnya biasanya kebiasaan membawa potongan kode pyplot dari contoh lama. Perbaikannya adalah memanggil ax.set_title() pada panel yang dimaksud, karena plt.title() menyasar Axes aktif dan bukan panel yang sedang dikerjakan.
Kesalahan kedua menganggap nilai kembali plt.subplots(2, 2) berupa satu objek Axes. Nilai kembali fungsi tersebut adalah Figure dan array NumPy berisi empat Axes, sehingga ax berbentuk array dua dimensi. Penyebab kebingungannya adalah kebiasaan pada kasus satu panel, ketika ax memang berupa satu objek. Perbaikannya adalah mengakses panel dengan indeks seperti ax[0, 1], atau meratakan array dengan ax.ravel() terlebih dahulu apabila perulangan lebih nyaman ditulis. Pesan error seperti AttributeError: 'numpy.ndarray' object has no attribute 'set_title' langsung menunjukkan penyebabnya, yaitu panel yang dimaksud belum diakses dari array.
Ringkasan#
plt.subplots()mengembalikanFiguredanAxes, dan seluruh pengubahan gambar dilakukan melalui metode kedua objek tersebut.- pyplot menyimpan satu figure dan satu Axes aktif pada state global, yang dapat diambil dengan
plt.gcf()danplt.gca(). - State global sulit menskalakan karena sasaran perintah bergantung pada urutan eksekusi, bukan pada nama objek.
- Gaya implisit layak untuk eksplorasi cepat, sedangkan kode yang digunakan ulang sebaiknya berorientasi objek.
Referensi#
- Quick start guide — Matplotlib — Pengantar resmi yang menetapkan pola fig dan ax sebagai gaya penulisan utama.
- matplotlib.pyplot — Matplotlib — Deskripsi pyplot sebagai antarmuka berbasis state beserta fungsi gcf dan gca.
- Axes API — Matplotlib — Daftar metode panel seperti set_title, set_xlabel, plot, dan scatter yang digunakan skrip.