Esensi pembuatan grafik

Pola inti matplotlib dan seaborn: figur, sumbu, data, dan langkah pembuatan grafik yang berulang.

Daftar isi

Pembuatan grafik di matplotlib dan seaborn mengikuti pola yang sama pada setiap kasus, yaitu menyiapkan figur, mengisi data, menuliskan label, lalu menyimpan gambar. Topik ini membahas pola inti tersebut melalui contoh bertingkat, dimulai dari grafik batang sederhana, dilanjutkan grafik garis tren, dan ditutup dengan padanan yang lebih ringkas di seaborn. Setelah membaca topik ini, grafik dasar dapat dibuat ulang dari nol dengan langkah yang selalu sama.

Pola dasar matplotlib#

matplotlib memisahkan dua objek utama dalam setiap gambar, yaitu figure sebagai kanvas keseluruhan dan axes sebagai area gambar yang memuat sumbu, judul, serta data. Fungsi plt.subplots() membuat kedua objek itu sekaligus dan mengembalikannya sebagai sepasang variabel. Konvensi penamaannya sudah baku, yaitu fig untuk figure dan ax untuk axes. Pengaturan sumbu, label, dan judul dilakukan terhadap ax, sedangkan penyimpanan berkas gambar dilakukan melalui pyplot.

Langkah pembuatan grafik berulang di setiap kasus dan selalu dimulai dari persiapan yang sama. Lingkungan tanpa layar, termasuk server eksekusi skrip, membutuhkan matplotlib.use("Agg") yang dipanggil sebelum pyplot diimpor. Setelah persiapan itu, prosedurnya berupa empat langkah berurutan.

  1. Buat fig dan ax dengan plt.subplots().
  2. Gambar data ke ax, misalnya ax.bar() untuk grafik batang.
  3. Tulis label dengan ax.set_xlabel(), ax.set_ylabel(), dan ax.set_title().
  4. Simpan gambar dengan plt.savefig() beserta kepadatan titik yang diinginkan, misalnya dpi=120.

Berkas grafik-batang.py berikut memuat contoh lengkapnya. Data berupa nilai rata-rata ujian matematika untuk tiga kelas, dan gambar hasilnya disimpan sebagai batang-nilai-kelas.png di direktori yang sama dengan skripnya.

python grafik-batang.py
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

kelas = ["7A", "7B", "7C"]
nilai_rata = [78, 84, 81]

fig, ax = plt.subplots()
ax.bar(kelas, nilai_rata)
ax.set_xlabel("Kelas")
ax.set_ylabel("Nilai rata-rata")
ax.set_title("Nilai rata-rata ujian matematika per kelas")
plt.savefig("batang-nilai-kelas.png", dpi=120)
print("Grafik tersimpan: batang-nilai-kelas.png")
text Keluaran
Grafik tersimpan: batang-nilai-kelas.png

Grafik batang nilai rata-rata ujian matematika untuk tiga kelas
Grafik batang nilai rata-rata ujian matematika untuk tiga kelas

Gambar di atas merupakan hasil dari skrip tersebut. Ketiga batang terbaca nilainya dari sumbu vertikal, dan labelnya menjelaskan besaran serta kelompok data yang dibandingkan. Grafik sederhana seperti ini sudah memenuhi syarat teknis penyajian, yaitu ada data, ada label, dan ada judul, sehingga pembaca tidak perlu menebak isi gambar.

Grafik garis untuk tren waktu#

Grafik garis dibuat dengan pola yang persis sama, dan hanya fungsi penggambar beserta datanya yang berubah. Fungsi ax.plot() menghubungkan titik-titik data dengan garis, sedangkan parameter marker="o" menambahkan tanda titik pada setiap data sehingga perubahan antarbulan tetap terbaca. Data yang digunakan berupa jumlah peminjaman buku perpustakaan selama enam bulan, dari Januari sampai Juni.

Berkas grafik-garis.py berikut menerapkan keempat langkah yang sama pada data peminjaman tersebut.

python grafik-garis.py
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

bulan = ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun"]
peminjaman = [312, 289, 347, 402, 386, 441]

fig, ax = plt.subplots()
ax.plot(bulan, peminjaman, marker="o")
ax.set_xlabel("Bulan")
ax.set_ylabel("Jumlah peminjaman")
ax.set_title("Peminjaman buku per bulan, Januari sampai Juni")
plt.savefig("garis-peminjaman.png", dpi=120)
print("Grafik tersimpan: garis-peminjaman.png")
text Keluaran
Grafik tersimpan: garis-peminjaman.png

Grafik garis peminjaman buku per bulan dari Januari sampai Juni
Grafik garis peminjaman buku per bulan dari Januari sampai Juni

Kenaikan dan penurunan peminjaman kini terbaca sebagai arah garis. Titik terendah terjadi pada Februari, sedangkan titik tertinggi terjadi pada Juni. Dari sisi kode, perbedaan dengan contoh batang hanya berada pada satu baris, yaitu penggantian ax.bar() dengan ax.plot(). Kesamaan langkah inilah yang membuat pembuatan grafik matplotlib tidak perlu dipelajari ulang dari awal untuk setiap jenis grafik baru.

Padanan cepat dengan seaborn#

seaborn bekerja sebagai lapisan di atas matplotlib dan menyediakan fungsi yang namanya mengikuti jenis grafiknya, misalnya sns.barplot() untuk grafik batang. Data berbentuk tabel pandas diserahkan langsung melalui parameter data, lalu kolomnya ditunjuk melalui parameter x dan y. Dengan cara ini, pembuatan grafik tidak lagi memerlukan deret terpisah untuk setiap sumbu, dan tabel yang sama dapat digunakan kembali untuk beberapa grafik.

Berkas grafik-seaborn.py berikut menggambar data nilai ujian yang sama dengan contoh batang pertama, kali ini melalui seaborn. Argumen ax=ax menempatkan hasilnya pada axes yang sudah dibuat, sehingga label dan judul tetap diatur dengan cara matplotlib.

python grafik-seaborn.py
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

df = pd.DataFrame({
    "kelas": ["7A", "7B", "7C"],
    "nilai_rata": [78, 84, 81],
})

fig, ax = plt.subplots()
sns.barplot(data=df, x="kelas", y="nilai_rata", ax=ax)
ax.set_xlabel("Kelas")
ax.set_ylabel("Nilai rata-rata")
ax.set_title("Nilai rata-rata ujian matematika per kelas")
plt.savefig("batang-seaborn.png", dpi=120)
print("Grafik tersimpan: batang-seaborn.png")
text Keluaran
Grafik tersimpan: batang-seaborn.png

Grafik batang dari seaborn untuk nilai rata-rata per kelas
Grafik batang dari seaborn untuk nilai rata-rata per kelas

Hasil akhirnya menyerupai versi matplotlib, tetapi jumlah baris kodenya lebih pendek. seaborn juga menghitung agregasi secara otomatis ketika satu kategori memiliki lebih dari satu nilai, misalnya rata-rata untuk setiap kelas. Kontrol halus seperti rentang sumbu khusus dan posisi anotasi tetap dijalankan melalui matplotlib, sehingga pemahaman pada bagian Pola dasar matplotlib tetap digunakan penuh.

Kesalahan umum#

Tiga kesalahan berikut paling sering muncul saat pola ini dipraktikkan pertama kali, beserta penyebab dan perbaikannya.

  • plt.show() dipanggil di lingkungan tanpa layar. Perintah tersebut mencoba menampilkan jendela yang tidak tersedia, sehingga matplotlib menampilkan peringatan dan program tidak menghasilkan berkas apa pun. Perbaikannya, ganti plt.show() dengan plt.savefig().
  • matplotlib.use("Agg") dipanggil setelah pyplot diimpor. Urutan ini dapat membuat backend tidak sempat berganti dan program tetap mencoba membuka jendela yang tidak ada. Perbaikannya, panggil matplotlib.use() pada baris pertama sebelum import matplotlib.pyplot.
  • plt.savefig() dilupakan atau dipanggil terlalu dini. Figur hanya hidup selama program berjalan, sehingga tanpa penyimpanan tidak ada berkas yang tersisa, sedangkan penyimpanan yang terlalu dini menghasilkan gambar tanpa label. Perbaikannya, letakkan plt.savefig() di akhir skrip, tepat sebelum pernyataan print konfirmasi.

Ringkasan#

  • fig, ax = plt.subplots() membuat figure dan axes, lalu ax.bar() atau ax.plot() mengisi datanya.
  • Label ditulis dengan ax.set_xlabel(), ax.set_ylabel(), dan ax.set_title(), sedangkan gambar disimpan dengan plt.savefig("nama-berkas.png", dpi=120).
  • matplotlib.use("Agg") dipanggil sebelum pyplot diimpor pada lingkungan tanpa layar, dan plt.savefig() menggantikan plt.show().
  • seaborn memangkas kode untuk grafik standar dari tabel pandas dan tetap bekerja di atas matplotlib.

Referensi#