Kursus Python / Membuat grafik batang dan menyimpan hasil Matplotlib

Matplotlib membuat grafik dari data, sumbu, dan label yang ditentukan secara eksplisit. Mulailah dengan pertanyaan perbandingan yang jelas, lalu pilih apakah hasil perlu ditampilkan sebagai jendela atau disimpan sebagai file. Grafik batang berikut membandingkan total pengeluaran dua kategori menggunakan satuan KRW dan titik awal sumbu nol.

Menentukan perbandingan dan menyiapkan lingkungan

Grafik batang sesuai untuk membandingkan total kategori seperti makanan dan transportasi. Untuk perubahan sepanjang waktu, Anda memerlukan data tanggal yang terurut; dua kategori saja tidak membentuk tren waktu. Sebelum menggambar, periksa angka, satuan, data ditolak, dan total sumber. Grafik tidak memperbaiki agregasi yang salah.

Aktifkan lingkungan virtual proyek dan pasang paket dengan interpreter yang sama:

python -m pip install matplotlib

Matplotlib adalah paket pihak ketiga. Gunakan rilis yang kompatibel dengan Python serta sistem operasi Anda. Contoh ini dijalankan pada Python 3.12 dengan Matplotlib 3.11.2. Total 11500 dan 2500 dapat disiapkan melalui agregasi pandas, tetapi pada latihan ini keduanya ditulis langsung agar proses menggambar mudah diperiksa.

Membuat dan menyimpan grafik lengkap

Buat folder keluaran baru karena penyimpanan menimpa expense-chart.png yang sudah ada. Simpan kode lengkap berikut sebagai chart.py dengan UTF-8 dan jalankan python chart.py pada terminal lingkungan proyek. Jika nama interpreter Anda adalah python3, gunakan nama itu.

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
plt.rcParams.update({"font.size": 18, "axes.titlesize": 22, "axes.labelsize": 20, "xtick.labelsize": 18, "ytick.labelsize": 18})

categories = ["food", "transport"]
amounts = [11500, 2500]
fig, ax = plt.subplots(figsize=(7, 4), layout="constrained")
bars = ax.bar(categories, amounts, color=["#2b6cb0", "#d69e2e"])
ax.set_ylabel("Amount (KRW)")
ax.set_title("Expenses by category")
ax.set_ylim(0, max(amounts) * 1.2)
ax.bar_label(bars, fmt="%.0f", padding=3)
fig.savefig("expense-chart.png", dpi=160)
plt.close(fig)
print("saved expense-chart.png")

Hasil pada terminal:

saved expense-chart.png

Buka file PNG yang dihasilkan pada folder kerja. Contoh dasar menggunakan label Inggris agar kode sumber mudah dibandingkan. Ada dua batang dengan tinggi 11500 dan 2500, angka di atas batang, serta sumbu vertikal mulai dari nol sampai 13800. Batas atas memberi ruang untuk label tanpa mengubah nilai data.

Membedakan Figure, Axes, dan backend

Figure adalah gambar secara keseluruhan, sedangkan Axes adalah wilayah koordinat dan data di dalamnya. Referensi fig dan ax memperjelas objek mana yang diubah. ax.bar menambahkan batang, pengaturan ylabel dan title memberi konteks, sedangkan fig.savefig menyimpan gambar.

Backend Agg membuat file tanpa antarmuka grafis, sehingga sesuai untuk skrip laporan otomatis. Pemilihannya dilakukan sebelum mengimpor pyplot. Jika Anda memang ingin jendela interaktif pada desktop, hapus pemilihan Agg dan panggil plt.show() setelah menyimpan namun sebelum plt.close(fig); lingkungan harus menyediakan backend GUI yang sesuai. Sekadar menambahkan show pada backend noninteraktif tidak menjamin sebuah jendela muncul.

Tutup figure setelah selesai, terutama ketika membuat banyak laporan dalam satu proses. close melepaskan figure dari pengelolaan pyplot; file yang telah disimpan tetap ada. Rincian pilihan keluaran dijelaskan dalam panduan backend Matplotlib.

Menerjemahkan label dan memilih font yang tersedia

Untuk versi Indonesia, ubah judul pada contoh menjadi Pengeluaran per kategori, label sumbu menjadi Jumlah (KRW), dan tambahkan ax.set_xticks(range(len(categories)), ["Makanan", "Transportasi"]) setelah batang dibuat. Pertahankan data 11500 dan 2500, urutan kategori, serta baseline nol. Terjemahan label tidak boleh mengubah tinggi batang.

Grafik di bawah dibuat dengan menjalankan penyesuaian tersebut memakai font Noto Sans yang benar-benar tersedia, lalu menyimpan PNG dan mengonversi salinan publikasi ke WebP. Hasilnya tetap membandingkan dua nilai yang sama:

Grafik batang pengeluaran makanan 11500 KRW dan transportasi 2500 KRW dengan sumbu dimulai dari nol

Nama keluarga font harus tersedia di sistem. Jika Anda memiliki file font, tambahkan file tersebut pada font manager sebelum membuat figure. Contoh pengaturan berikut memakai jalur font Windows yang mendukung tulisan Korea; jalur itu hanya contoh dan harus diganti dengan file yang benar-benar ada bila lingkungan berbeda:

from matplotlib import font_manager
font_path = "C:/Windows/Fonts/malgun.ttf"
font_manager.fontManager.addfont(font_path)
plt.rcParams["font.family"] = font_manager.FontProperties(fname=font_path).get_name()
plt.rcParams["axes.unicode_minus"] = False

Letakkan pengaturan setelah import matplotlib.pyplot as plt dan sebelum fig, ax dibuat. Untuk hasil Indonesia yang ditampilkan di sini, ganti font_path dengan jalur font Noto Sans yang tersedia. FontProperties membaca nama keluarga dari file, bukan menganggap nama file sama dengan nama font. Jangan menyalin jalur pengguna komputer lain sebagai persyaratan umum.

Jika file tidak ditemukan, pilih jalur yang benar lalu mulai ulang skrip. Jika karakter berubah menjadi kotak atau peringatan glyph muncul, pastikan font memiliki karakter yang dipakai. Penggunaan font tambahan tidak mengubah angka atau satuan. Rincian pengaturan tersedia pada FontProperties Matplotlib.

Memeriksa keluaran dan memulihkan ukuran

  1. Buka PNG hasil eksekusi dan pastikan dua batang serta label 11500 dan 2500 terlihat. Periksa satuan KRW dan sumbu yang dimulai dari nol.
  2. Ubah sementara figsize=(7, 4) menjadi figsize=(4, 4), simpan dengan nama lain, dan periksa apakah judul atau label bertumpuk atau terpotong. Pada versi Indonesia berfont besar, lebar yang sempit dapat memotong judul dan menumpukkan kategori.
  3. Kembalikan ukuran ke 7 × 4 inci, simpan lagi pada jalur keluaran yang sesuai, dan periksa hasil akhirnya. Pada 160 dpi, ukuran asli menghasilkan 1120 × 640 piksel.

layout="constrained" membantu mengatur jarak, tetapi tidak menjamin semua judul panjang cocok pada setiap ukuran. Jika ruang kurang, pertimbangkan ukuran gambar, ukuran font, atau pemenggalan label tanpa menghilangkan makna. Pada halaman web, pastikan gambar tidak melampaui lebar isi dan angka tetap dapat dibaca.

Gunakan nama file bertanggal atau ID eksekusi ketika beberapa versi laporan perlu disimpan. Jangan memotong sumbu atau melebihkan luas dan warna untuk membuat perbedaan terlihat lebih besar. Pembaca perlu memahami perbandingan dari nilai, kategori, satuan, dan skala yang konsisten.