Grafik adalah titik temu paling terlihat antara NumPy dan pustaka lain: array yang selama ini hanya kita agregasi dan bandingkan akhirnya tampil sebagai garis, titik, atau gambar. Matplotlib 3.9.2 — versi yang kami pakai menguji bab ini — dirancang dari awal untuk menggambar array NumPy: plt.plot menerima dua array 1-D, plt.imshow menerima array 2-D, dan plt.bar menerima pasangan frekuensi hasil np.histogram.

Satu penyesuaian lingkungan penting sebelum masuk kode: semua contoh di bab ini diuji di backend Agg, yaitu mesin render yang menulis gambar ke memori dan file tanpa membuka jendela. Pola inilah yang tepat untuk script, server, dan lingkungan uji tanpa layar.

Backend Agg dan Grafik Garis #

Pemanggilan matplotlib.use("Agg") harus dilakukan sebelum import matplotlib.pyplot, karena backend dipilih saat pyplot dimuat. Setelah grafik tersusun, plt.savefig menuliskannya sebagai file PNG:

python
import os
import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

bulan = np.arange(1, 7)
penjualan = np.array([120, 135, 150, 145, 160, 180])
tinggi = penjualan * 1000
plt.plot(bulan, tinggi, marker="o")
plt.title("Penjualan Gudang Semester I")
plt.savefig("penjualan.png")
print("File tersimpan:", os.path.exists("penjualan.png"))

Output yang Dihasilkan:

text
File tersimpan: True

Mari kita bedah:

  1. Baris 4-5 (matplotlib.use("Agg")): backend non-interaktif dipilih sebelum pyplot diimpor; tanpa layar, plt.show() tidak punya jendela untuk ditampilkan, maka grafik disimpan dengan savefig.
  2. Baris 7-9: dua array 1-D disiapkan; penjualan * 1000 memperlihatkan kebiasaan yang baik — semua penghitungan dikerjakan NumPy, matplotlib hanya menggambar hasilnya.
  3. Baris 10-11 (plt.plot(...)): matplotlib menerima dua array berpanjang sama dan memetakan pasangan (x, y) menjadi satu garis dengan penanda titik.
  4. Baris 13-14 (plt.savefig(...)): gambar ditulis ke direktori kerja sebagai penjualan.png; os.path.exists membuktikan file itu benar-benar lahir, dan inilah output yang bisa diuji.

Array 2-D sebagai Gambar: imshow #

Matplotlib juga memperlakukan array 2-D sebagai citra: setiap sel dianggap satu piksel dan nilainya dipetakan ke warna. Kita buat citra sintetis yang deterministik — gradien terang dari kiri atas ke kanan bawah:

python
import os
import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

piksel = np.linspace(0, 255, 64).reshape(8, 8)
plt.imshow(piksel, cmap="viridis")
plt.savefig("gradien.png")
print(piksel.shape, piksel.dtype)
print("File tersimpan:", os.path.exists("gradien.png"))

Output yang Dihasilkan:

text
(8, 8) float64
File tersimpan: True

Penjelasannya:

  1. Baris 7 (np.linspace(...).reshape(8, 8)): 64 nilai naik dari 0 sampai 255 disusun menjadi array 2-D; bentuk (8, 8) langsung menjadi ukuran gambar.
  2. Baris 8 (plt.imshow(...)): imshow membaca piksel sel demi sel dan menerjemahkan nilai ke warna melalui colormap viridis — nilai kecil gelap, nilai besar terang.
  3. Baris 9-11: hasil disimpan sebagai gradien.png; shape dan dtype dicetak karena keduanya menentukan bentuk dan presisi gambar.

Kombinasi np.linspace + reshape + imshow inilah pola dasar menggambar data dua dimensi: peta suhu, peta frekuensi, atau matriks korelasi. Prinsipnya sama seperti saat kita menyusun data 2-D pada bab Array Multidimensi.

Histogram: np.histogram Lalu plt.bar #

Untuk histogram, kita pisahkan penghitungan (tugas NumPy) dari penggambaran (tugas matplotlib). Frekuensi per rentang dihitung dengan np.histogram, lalu digambar sebagai diagram batang:

python
import os
import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

nilai = np.array([65, 70, 75, 80, 85, 90, 95, 55, 60, 88])
counts, edges = np.histogram(nilai, bins=[50, 60, 70, 80, 90, 100])
print(counts)
print(edges)
plt.bar(edges[:-1], counts, width=10, align="edge")
plt.savefig("histogram-nilai.png")
print("File tersimpan:", os.path.exists("histogram-nilai.png"))

Output yang Dihasilkan:

text
[1 2 2 3 2]
[ 50  60  70  80  90 100]
File tersimpan: True

Bedah baris demi baris:

  1. Baris 7: sepuluh nilai ujian fiktif menjadi data mentah.
  2. Baris 8-9 (np.histogram(...)): tepi rentang diberikan eksplisit agar labelnya bersih; hasilnya array frekuensi [1 2 2 3 2] dan array tepi (6,) untuk lima rentang [50, 60) sampai [90, 100].
  3. Baris 11 (plt.bar(...)): batang digambar dari edges[:-1] sebagai batas kiri tiap rentang, counts sebagai tinggi, width=10 menutupi lebar rentang, dan align="edge" menempelkan batang ke tepi kiri.
  4. Baris 12-13: grafik disimpan; frekuensi counts juga bisa dipakai ulang untuk laporan teks tanpa menggambar ulang.

Pemisahan ini bukan formalitas: np.histogram mengembalikan data numerik yang bisa dihitung ulang, disimpan, atau diuji, sementara plt.bar hanya bertugas memvisualisasikannya. Matplotlib sesungguhnya juga menerima list Python — ia mengonversinya ke array di dalam — tetapi alur kerja di atas menjaga seluruh praproses (penjumlahan, normalisasi, penyaringan) tetap vectorized sebelum sampai ke lapisan gambar.