Line plot unggul untuk menunjukkan tren, tetapi kurang adil ketika pertanyaan kita adalah “produk mana yang paling laku?” — mata kita harus menelusuri garis satu per satu. Bar plot menjawab pertanyaan perbandingan dengan tinggi batang yang berdampingan. Pada pandas, method .plot.bar() menggambar bar dari setiap kolom numerik, .plot.bar(stacked=True) menumpuknya, dan .plot.barh() memutar orientasinya menjadi horizontal. Chapter ini membahas ketiganya dengan dataset penjualan yang sama.

Struktur Bar Plot di Balik Layar #

Objek Axes hasil bar plot menyimpan bar dalam ax.containers — satu container untuk setiap kolom DataFrame. Struktur ini bisa kita periksa lewat kode, sehingga kita tahu persis apa yang digambar pandas tanpa menebak dari tampilan.

Bar Grup, Bar Bertumpuk, dan Bar Horizontal #

python
import matplotlib

matplotlib.use("Agg")
import pandas as pd
from pathlib import Path

bulan = ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun"]
penjualan = pd.DataFrame(
    {
        "Buku Tulis": [320, 340, 310, 380, 400, 420],
        "Pulpen": [180, 210, 230, 220, 250, 270],
        "Kertas HVS": [260, 250, 290, 300, 280, 310],
    },
    index=pd.Index(bulan, name="bulan"),
)
print("Total per produk:")
print(penjualan.sum())

ax = penjualan.plot.bar(figsize=(8, 4))
print("\nTipe objek          :", type(ax).__name__)
print("Jumlah grup bar     :", len(ax.containers))
print("Jumlah bar per grup :", len(ax.containers[0]))
print("Tinggi bar grup 1   :", [int(p.get_height()) for p in ax.containers[0]])

ax.get_figure().savefig("bar_penjualan.png", dpi=100)
print("\nPlot tersimpan sebagai bar_penjualan.png")

ax_stacked = penjualan.plot.bar(stacked=True)
print("\nstacked=True:")
print("Jumlah grup bar     :", len(ax_stacked.containers))
print("Tinggi bar grup 1   :", [int(p.get_height()) for p in ax_stacked.containers[0]])

ax_barh = penjualan.plot.barh()
print("\nbarh:")
print("Tipe objek          :", type(ax_barh).__name__)
print("Jumlah grup bar     :", len(ax_barh.containers))

Path("bar_penjualan.png").unlink()

Output yang Dihasilkan:

text
Total per produk:
Buku Tulis    2170
Pulpen        1360
Kertas HVS    1690
dtype: int64

Tipe objek          : Axes
Jumlah grup bar     : 3
Jumlah bar per grup : 6
Tinggi bar grup 1   : [320, 340, 310, 380, 400, 420]

Plot tersimpan sebagai bar_penjualan.png

stacked=True:
Jumlah grup bar     : 3
Tinggi bar grup 1   : [320, 340, 310, 380, 400, 420]

barh:
Tipe objek          : Axes
Jumlah grup bar     : 3

Pada pemanggilan pertama, len(ax.containers) bernilai 3 — satu container per kolom produk — dan setiap container berisi 6 bar, satu per bulan. Nilai tinggi bar grup pertama tercetak sebagai [320, 340, 310, 380, 400, 420], persis kolom Buku Tulis. Dengan stacked=True, ketiga container tetap ada, tetapi bar-nya ditumpuk dalam satu kolom posisi sehingga tinggi total per bulan menjadi jumlah ketiga produk. Pemanggilan barh menghasilkan struktur container yang sama, hanya arah bar-nya horizontal.

Mari kita bedah baris-baris kuncinya:

  1. Baris 16-17 (penjualan.sum()): total per produk dicetak sebagai pembanding — Buku Tulis 2170, Kertas HVS 1690, Pulpen 1360 — angka yang nantinya terlihat pada panjang bar.
  2. Baris 19 (penjualan.plot.bar(figsize=(8, 4))): satu bar per kombinasi bulan dan produk, disusun berkelompok. Label bulan diputar 90 derajat secara bawaan agar tidak saling menumpuk.
  3. Baris 22-23 (len(ax.containers[0]) dan get_height()): container pertama mewakili kolom pertama; tinggi tiap bar membuktikan datanya benar-benar dari DataFrame.
  4. Baris 28 (penjualan.plot.bar(stacked=True)): bar ditumpuk sehingga bagian atas tumpukan Januari berada di 760 — total penjualan bulan itu.
  5. Baris 33 (penjualan.plot.barh()): versi horizontal yang nyaman ketika nama kategori panjang, karena label terbaca dari kiri ke kanan.

Tabel berikut merangkum kapan bentuk mana yang layak dipilih:

BentukCocok untukPerhatian
plot.bar()Membandingkan nilai antarkategoriBanyak kolom membuat grup ramai
plot.bar(stacked=True)Melihat komposisi dan total sekaligusNilai kolom kecil sulit dibaca sendirian
plot.barh()Nama kategori panjang, banyak kategoriNilai dibaca pada sumbu horizontal

Bar plot merangkum satu angka per kategori. Ketika kita ingin melihat seluruh sebaran nilai — berapa banyak hari penjualan jatuh di kisaran tertentu — satu bar per kategori tidak lagi cukup, dan histogram pada chapter berikutnya yang menjadi alatnya.

Dokumentasi pandas.DataFrame.plot.bar dan pandas.DataFrame.plot.barh merinci parameter stacked serta pengaturan bar lainnya, sementara user guide visualization menampilkan contoh bar plot bertumpuk dengan data nyata.