Matplotlib menggambar apa pun yang kita tentukan, tetapi semua agregasi masih menjadi tugas kita: ingin rata-rata per kelompok? hitung dulu dengan groupby. Seaborn mengambil pekerjaan itu dari bahu kita — library ini menerima DataFrame secara langsung, mengenali kolom lewat nama, dan menghitung statistik yang digambarkan secara otomatis. Pada Chapter ini kita memakai pola data=, x=, y=, dan hue= untuk barplot agregasi, lalu memvisualisasikan matriks korelasi hasil DataFrame.corr() sebagai heatmap.
API Seaborn yang Berorientasi DataFrame #
Seaborn dibangun di atas Matplotlib dengan dua keputusan desain yang cocok untuk pandas. Pertama, fungsi-fungsinya berorientasi dataset: kita menyerahkan DataFrame utuh, lalu memetakan kolom ke peran visual seperti sumbu x, sumbu y, dan pembeda warna. Kedua, fungsi statistiknya mengagregasi sendiri — barplot menghitung mean per kelompok, boxplot menghitung kuartil — tanpa groupby manual.
Fungsi seaborn terbagi dua keluarga yang perlu kita bedakan:
| Keluarga | Nilai kembalian | Contoh |
|---|---|---|
| Axes-level | satu objek Axes Matplotlib | barplot, heatmap, boxplot, regplot |
| Figure-level | objek FacetGrid yang mengelola beberapa panel | catplot, relplot, lmplot |
Karena axes-level mengembalikan Axes, semua method dari Chapter Pandas dan Matplotlib — set_title(), set_xlabel(), get_figure() — langsung berlaku pada hasilnya.
Barplot Agregasi Otomatis dari DataFrame #
Contoh berikut memakai kembali tabel penjualan sembako 12 baris tiga kota. Kita minta rata-rata total penjualan per produk, dibedakan warna menurut kota, tanpa satu baris groupby pun.
import os
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
penjualan = pd.DataFrame({
"kota": ["Jakarta", "Jakarta", "Jakarta", "Jakarta",
"Bandung", "Bandung", "Bandung", "Bandung",
"Surabaya", "Surabaya", "Surabaya", "Surabaya"],
"produk": ["Beras", "Minyak", "Gula", "Kopi",
"Beras", "Minyak", "Gula", "Kopi",
"Beras", "Minyak", "Gula", "Kopi"],
"jumlah": [40, 25, 30, 20, 32, 22, 27, 18, 36, 19, 25, 21],
"harga": [68000, 35000, 18000, 26000, 67500, 34500, 17500, 25500, 67000, 34000, 17200, 25000],
})
penjualan["total"] = penjualan["jumlah"] * penjualan["harga"]
sns.set_theme()
# 1. Barplot agregasi otomatis: mean total per produk, dibedakan kota
ax = sns.barplot(data=penjualan, x="produk", y="total", hue="kota", errorbar=None)
ax.set_title("Rata-rata Total Penjualan per Produk dan Kota")
ax.set_ylabel("Total (Rupiah)")
ax.get_figure().savefig("bar_produk.png", dpi=110, bbox_inches="tight")
print("barplot ->", type(ax).__name__)
print("legenda :", [t.get_text() for t in ax.get_legend().get_texts()])
print("sumbu x :", [t.get_text() for t in ax.get_xticklabels()])
plt.close(ax.get_figure())
# 2. Heatmap korelasi kolom numerik
korelasi = penjualan[["jumlah", "harga", "total"]].corr(numeric_only=True)
print(korelasi.round(2))
ax2 = sns.heatmap(korelasi, annot=True, fmt=".2f", cmap="Blues")
ax2.set_title("Korelasi Antar Kolom Numerik")
ax2.get_figure().savefig("heatmap_korelasi.png", dpi=110, bbox_inches="tight")
print("heatmap ->", type(ax2).__name__)
plt.close(ax2.get_figure())
os.remove("bar_produk.png")
os.remove("heatmap_korelasi.png")
print("2 PNG sementara selesai dibuat lalu dihapus")Output yang Dihasilkan:
barplot -> Axes
legenda : ['Jakarta', 'Bandung', 'Surabaya']
sumbu x : ['Beras', 'Minyak', 'Gula', 'Kopi']
jumlah harga total
jumlah 1.00 0.72 0.86
harga 0.72 1.00 0.97
total 0.86 0.97 1.00
heatmap -> Axes
2 PNG sementara selesai dibuat lalu dihapusMari kita telaah baris-baris pentingnya:
- Baris 19 (
penjualan["total"] = ...): kolom numerik baru disiapkan terlebih dahulu; seaborn tidak menghitung kolom hasil, ia hanya membaca kolom yang ada. - Baris 21 (
sns.set_theme()): tema bawaan seaborn diterapkan sekali di awal sehingga palet warna, kisi, dan huruf plot selanjutnya tampil seragam. - Baris 24 (
sns.barplot(data=penjualan, ...)): argumendatamenerima DataFrame;x="produk"dany="total"adalah nama kolom, bukan data;hue="kota"memecah tiap produk menjadi tiga batang warna berbeda;errorbar=Nonemematikan error bar agar batang menampilkan mean saja. - Baris 28-30: nilai kembalian berupa
Axes(keluarga axes-level), dan kita membaca kembali label legendJakarta,Bandung,Surabayaserta urutan produk pada sumbu x — keduanya disusun seaborn dari isi kolom. - Baris 34 (
corr(...)): methodDataFrame.corr(numeric_only=True)menghitung korelasi Pearson antar kolom numerik dan mengembalikan DataFrame kecil berisi matriks korelasi. - Baris 36 (
sns.heatmap(...)): heatmap mewarnai tiap sel matriks sesuai nilainya;annot=Truemenuliskan angka pada sel danfmt=".2f"memformatnya dua desimal.
Perhatikan matriks korelasinya: harga berkorelasi kuat dengan total (0,97) karena total adalah hasil kali jumlah dan harga, sedangkan jumlah berkorelasi lebih lemah dengan keduanya. Membaca angka seperti inilah gunanya heatmap — pola terlihat sekilas tanpa menelusuri tabel.
Seaborn menghitung dan menggambar, tetapi angka di baliknya — seberapa berbeda dua kelompok, seberapa kuat garis tren — tetap perlu diuji secara formal. Chapter berikutnya memakai scipy untuk mengambil angka-angka statistik tersebut langsung dari Series pandas.
Referensi resmi untuk pendalaman: dokumentasi seaborn , panduan visualisasi pandas , dan pandas.DataFrame.corr .