Topik ini membahas penyusunan beberapa panel ke dalam satu Figure beserta keputusan ekspor gambar ke berkas. Materinya mencakup grid seragam dengan plt.subplots(), grid tak seragam dengan GridSpec, pembesaran lokal dengan inset_axes, dan daftar periksa ekspor antara format vektor dan raster. Satu skrip menghasilkan gambar akhir berisi tiga panel dan satu inset, lengkap dengan perbandingan ukuran berkas keluarannya.
Menyusun panel dengan subplots dan GridSpec#
Fungsi plt.subplots(baris, kolom) menyusun panel seragam dalam satu panggilan dan mengembalikan Figure beserta array Axes. Empat panel berukuran dua kali dua dibuat dengan satu baris kode:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(2, 2, figsize=(7, 4)) # empat panel dua kali duaGrid seragam tidak memenuhi semua kebutuhan, misalnya panel utama yang lebar di atas dan dua panel pendukung di bawah. Kelas GridSpec menyelesaikannya dengan sistem alamat: gs[0, :] membentang di kedua kolom pada baris pertama, sedangkan gs[1, 0] dan gs[1, 1] mengisi baris kedua. Setiap panel dibuat dengan fig.add_subplot() yang menerima irisan grid tersebut, dan panel yang membentang di beberapa sel mengikuti lebar sel gabungannya.
Skrip layout.py menerapkan pola itu pada dataset nilai ujian: panel lebar menampilkan nilai matematika 24 siswa menurut nomor urut daftar, panel bawah kiri membandingkan rata-rata per kelas dengan diagram batang yang berawal dari nol, dan panel bawah kanan menampilkan histogram distribusi. Jalankan skrip berikut dari direktori topiknya, kemudian periksa berkas layout.svg dan layout.png yang dihasilkannya.
Panel sebaiknya disusun ketika gambar-gambar perlu dibandingkan sejajar dengan skala yang sama. Gambar terpisah memaksa pembaca memindahkan ingatannya antarberkas, sedangkan panel dalam satu Figure mempertahankan satu sumbu referensi. Jumlah panel mengikuti perbandingan yang dijawab, dan dua panel yang tidak berhubungan lebih tepat disimpan sebagai gambar terpisah.
import csv
import os
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
with open("nilai_ujian.csv", newline="", encoding="utf-8") as f:
baris = list(csv.DictReader(f))
mat_semua = [int(r["nilai_matematika"]) for r in baris]
mat_A = [int(r["nilai_matematika"]) for r in baris if r["kelas"] == "7A"]
mat_B = [int(r["nilai_matematika"]) for r in baris if r["kelas"] == "7B"]
fig = plt.figure(figsize=(7, 4))
gs = GridSpec(2, 2, figure=fig)
# panel lebar: satu Axes menyeberangi dua kolom pada baris pertama
ax_utama = fig.add_subplot(gs[0, :])
ax_utama.plot(range(1, len(mat_semua) + 1), mat_semua, marker="o", markersize=3)
ax_utama.set_title("Nilai matematika menurut nomor urut daftar")
ax_utama.set_xlabel("Nomor urut siswa")
ax_utama.set_ylabel("Nilai")
# inset: pembesaran pada nomor urut 10 sampai 16
inset = ax_utama.inset_axes([0.62, 0.12, 0.34, 0.55])
inset.plot(range(1, len(mat_semua) + 1), mat_semua, marker="o", markersize=3)
inset.set_xlim(10, 16)
inset.tick_params(labelsize=7)
ax_utama.indicate_inset_zoom(inset, edgecolor="black")
# baris kedua: batang rata-rata per kelas dan histogram distribusi
ax_batang = fig.add_subplot(gs[1, 0])
rata = [sum(mat_A) / len(mat_A), sum(mat_B) / len(mat_B)]
ax_batang.bar(["7A", "7B"], rata, width=0.5)
ax_batang.set_ylim(0, 100)
ax_batang.set_ylabel("Rata-rata nilai")
ax_hist = fig.add_subplot(gs[1, 1])
ax_hist.hist(mat_semua, bins=8, edgecolor="white")
ax_hist.set_xlabel("Nilai matematika")
ax_hist.set_ylabel("Banyak siswa")
fig.tight_layout()
fig.savefig("layout.svg")
fig.savefig("layout.png", dpi=150, bbox_inches="tight")
print("ukuran layout.svg :", os.path.getsize("layout.svg"), "byte")
print("ukuran layout.png :", os.path.getsize("layout.png"), "byte")ukuran layout.svg : 49278 byte
ukuran layout.png : 69060 byteGambar menunjukkan ketiga panel dalam satu Figure: panel lebar membentang di dua kolom pada baris pertama, dan kedua panel pendukung berbagi baris kedua dengan tinggi yang sama. Susunan seperti ini umum pada laporan, yaitu panel utama membawa pesan inti sedangkan panel pendukung membantu pemeriksaan. Urutan add_subplot bebas ditentukan setelah grid dibuat, karena alamat grid sudah menetapkan posisi setiap panel.
Jarak antarpanel diatur ulang setelah semua panel selesai digambar. Pemanggilan fig.tight_layout() menggeser posisi panel agar judul, label sumbu, dan penanda skala tidak saling menutup, sebagaimana penggunaannya pada skrip. Tanpa langkah ini, label dua panel bertetangga sering bertabrakan, dan gambar terlihat rapat tanpa ruang antarbagian.
Inset untuk pembesaran#
Inset adalah Axes kecil di dalam panel lain yang menampilkan potongan data dengan skala berbeda. Posisi dan ukurannya dinyatakan dalam pecahan panel, sehingga [0.62, 0.12, 0.34, 0.55] berarti mulai dari 62 persen lebar panel dan 12 persen tinggi dari bawah, dengan lebar 34 persen dan tinggi 55 persen. Metode ax.inset_axes() membuat Axes tersebut dan mengembalikan objek Axes biasa yang dapat diatur seperti panel mana pun.
Pada layout.py, inset memperbesar nomor urut 10 sampai 16 di dalam panel lebar, dan ax.indicate_inset_zoom() menambahkan kotak penunjuk beserta dua garis penghubung antara kawasan sumber dan insetnya. Kombinasi ini menjawab kebutuhan yang sering muncul, yaitu tetap menampilkan keseluruhan deret sambil menampakkan detail pada bagian yang padat. Inset yang berlebihan sebaiknya dihindari, karena dua skala dalam satu panel menuntut perhatian pembaca dua kali.
Inset berbagi ruang dengan panel induknya, sehingga posisinya perlu dijaga agar tidak menutup data yang penting. Lokasi yang dipilih pada skrip berada di kawasan kosong panel lebar, dan garis penghubung dari indicate_inset_zoom() memperjelas kawasan mana yang diperbesar. Apabila potongan yang ditampilkan sama pentingnya dengan keseluruhannya, dua panel pada satu grid lebih tepat daripada inset yang menumpuk di satu panel.
Daftar periksa ekspor: vektor dan raster#
Keputusan ekspor menentukan kualitas gambar pada tempat penggunaannya. Format vektor seperti SVG dan PDF menyimpan instruksi menggambar, sehingga tajam pada tingkat perbesaran apa pun dan cocok untuk laporan serta cetakan. Format raster seperti PNG menyimpan piksel dengan kepadatan tertentu, sehingga cocok untuk slide dan web selama nilai dpi memadai, lazimnya 150 sampai 300. Daftar periksa berikut merangkum keputusan itu:
- Laporan dan cetak: pilih vektor berupa SVG atau PDF, dengan ukuran figure menyesuaikan kolom halaman.
- Slide dan web: pilih raster berupa PNG pada
dpi150 sampai 300. - Pengaturan ditulis eksplisit pada kode:
dpidanbbox_inchesdinyatakan padafig.savefig(), bukan dibiarkan pada nilai bawaan.
fig.savefig() menerima pengaturan yang menentukan hasil secara deterministik. Argumen dpi=150 menetapkan kepadatan piksel pada keluaran raster, sedangkan bbox_inches="tight" memangkas ruang kosong di sekeliling gambar sehingga ukuran akhirnya mengikuti isi. Kedua argumen sebaiknya ditulis setiap kali gambar disimpan, karena nilai bawaan dapat berubah antarversi dan gambar lama perlu dapat direproduksi ulang.
Ukuran berkas menjadi sinyal kualitas yang mudah diperiksa. Skrip mencetak ukuran layout.svg sebesar 49278 byte dan layout.png sebesar 69060 byte pada dpi 150. PNG lebih besar karena menyimpan piksel, sedangkan SVG menyimpan instruksi menggambar. Apabila SVG tumbuh sampai jutaan byte, biasanya ada ribuan titik data yang lebih layak diagregasi, dan apabila PNG tampak buram, nilai dpi dinaikkan atau formatnya diganti ke vektor.
Ringkasan#
plt.subplots(baris, kolom)menyusun grid seragam, sedangkanGridSpecmengatur panel yang membentang di beberapa kolom atau baris.ax.inset_axes()membuat pembesaran lokal dalam pecahan panel, denganindicate_inset_zoom()sebagai penunjuk kawasan sumbernya.- Ekspor vektor berupa SVG dan PDF untuk laporan serta cetak, sedangkan raster berupa PNG pada dpi 150 sampai 300 untuk slide dan web.
- Ukuran berkas keluaran adalah sinyal kualitas yang cepat diperiksa sebelum gambar digunakan.
Referensi#
- Arranging multiple Axes in a Figure — Matplotlib — Penjelasan resmi penyusunan Axes dalam satu Figure menggunakan GridSpec.
- Create multiple subplots using plt.subplots — Matplotlib — Contoh resmi penggunaan plt.subplots dengan beberapa panel.
- Nested Gridspecs — Matplotlib — Contoh resmi susunan panel bertingkat dengan GridSpec.
- matplotlib.axes.Axes.inset_axes — Matplotlib — Dokumentasi metode inset_axes beserta format koordinatnya.
- matplotlib.figure.Figure — Matplotlib — Dokumentasi metode savefig termasuk argumen dpi dan bbox_inches.