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:
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:
File tersimpan: TrueMari kita bedah:
- 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 dengansavefig. - Baris 7-9: dua array 1-D disiapkan;
penjualan * 1000memperlihatkan kebiasaan yang baik — semua penghitungan dikerjakan NumPy, matplotlib hanya menggambar hasilnya. - Baris 10-11 (
plt.plot(...)): matplotlib menerima dua array berpanjang sama dan memetakan pasangan(x, y)menjadi satu garis dengan penanda titik. - Baris 13-14 (
plt.savefig(...)): gambar ditulis ke direktori kerja sebagaipenjualan.png;os.path.existsmembuktikan 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:
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:
(8, 8) float64
File tersimpan: TruePenjelasannya:
- 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. - Baris 8 (
plt.imshow(...)):imshowmembacapikselsel demi sel dan menerjemahkan nilai ke warna melalui colormapviridis— nilai kecil gelap, nilai besar terang. - 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:
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:
[1 2 2 3 2]
[ 50 60 70 80 90 100]
File tersimpan: TrueBedah baris demi baris:
- Baris 7: sepuluh nilai ujian fiktif menjadi data mentah.
- 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]. - Baris 11 (
plt.bar(...)): batang digambar dariedges[:-1]sebagai batas kiri tiap rentang,countssebagai tinggi,width=10menutupi lebar rentang, danalign="edge"menempelkan batang ke tepi kiri. - Baris 12-13: grafik disimpan; frekuensi
countsjuga 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.