Kategori ada di mana-mana dalam data: menu, kota, pelanggan, hari. Pertanyaan yang menempel padanya hampir selalu berbentuk perbandingan — yang mana yang paling besar, yang mana yang tertinggal, dan seberapa jauh jaraknya. Bar chart menjawab keluarga pertanyaan itu dengan tanda visual yang paling kuat di antara semua tanda: panjang batang pada skala yang sama. Pada chapter ini kita bedah bar chart sungguhan: mengapa urutan batang penting, kapan memilih batang tegak atau mendatar, dan bagaimana melengkapi grafik dengan label nilai agar pembaca tidak perlu menaksir.
Kapan Grafik Perbandingan Dipakai #
Grafik perbandingan bekerja ketika setiap kategori memiliki satu angka yang melekat — total penjualan per menu, jumlah pelanggan per kota, atau rata-rata rating per produk. Angka itu biasanya merupakan hasil agregasi groupby(): satu baris hasil agregasi menjadi satu batang. Batas praktisnya sekitar 15-20 kategori; lebih banyak dari itu, pembaca kesulitan membandingkan dan sebaiknya data diringkas lebih dulu (misalnya tampilkan 10 teratas).
Dua aturan main membuat bar chart langsung terbaca. Pertama, sumbu nilai wajib dimulai dari nol agar panjang batang proporsional terhadap nilainya. Kedua, urutan batang sebaiknya ditentukan oleh datanya sendiri — diurutkan dari nilai terbesar — bukan oleh urutan kebetulan seperti urutan pengetikan atau urutan abjad.
Urutkan Batang Sesuai Data #
Urutan batang menentukan arah mata pembaca bergerak. Pada urutan acak, mata harus memindai seluruh grafik untuk menemukan yang tertinggi; pada urutan menurun, jawabannya sudah menunggu di posisi pertama. Mari kita lihat efek urutan itu pada data penjualan enam menu Toko Kopi Kita:
import pandas as pd
penjualan = pd.Series({
"es kopi susu": 28, "matcha latte": 19, "teh tawar": 12,
"cokelat panas": 9, "es teh melati": 15, "kopi tubruk": 22,
})
print("Urutan menu (apa adanya):")
print(penjualan.to_string())
print()
print("Urutan menu (terlaris ke terendah):")
print(penjualan.sort_values(ascending=False).to_string())Output yang Dihasilkan:
Urutan menu (apa adanya):
es kopi susu 28
matcha latte 19
teh tawar 12
cokelat panas 9
es teh melati 15
kopi tubruk 22
Urutan menu (terlaris ke terendah):
es kopi susu 28
kopi tubruk 22
matcha latte 19
es teh melati 15
teh tawar 12
cokelat panas 9Mari kita telaah baris-barisnya:
- Baris 3-6 (
pd.Series({...})): enam menu dan jumlah gelas terjualnya disimpan sebagai satu Series — satu kategori bernilai satu angka, persis bentuk data yang pas untuk bar chart. - Baris 8-9 (
to_string()): tampilanapa adanyamemperlihatkan urutan pengetikan: teh tawar (12) dan cokelat panas (9) menempel di tengah, sehingga menu terlaris dan terendah harus dicari satu per satu. - Baris 13 (
sort_values(ascending=False)): pengurutan menurun menempatkan es kopi susu (28) di puncak dan cokelat panas (9) di dasar; peringkat mana pun kini terbaca dari posisinya tanpa perlu membandingkan angka.
Pengecualian untuk aturan pengurutan adalah kategori yang punya urutan bawaan, misalnya tingkat kepuasan pelanggan dari “kecewa” sampai “sangat puas”, atau bulan Januari sampai Desember. Urutan alami itu harus dipertahankan karena justru menjadi informasi — kita bahas penanganannya pada chapter Visualisasi Data Kategorikal.
Bar Chart Tegak dengan Label Nilai #
Batang tegak adalah pilihan bila kategorinya tidak terlalu banyak dan labelnya pendek. Grafik yang baik juga menuliskan nilainya langsung di ujung batang, sehingga pembaca yang butuh angka persis tidak perlu menelusuri garis kisi ke sumbu:
import matplotlib.pyplot as plt
import pandas as pd
penjualan = pd.Series({
"es kopi susu": 28, "matcha latte": 19, "teh tawar": 12,
"cokelat panas": 9, "es teh melati": 15, "kopi tubruk": 22,
}).sort_values(ascending=False)
fig, ax = plt.subplots(figsize=(6, 3.5))
ax.bar(penjualan.index, penjualan.values, color="tab:blue")
ax.bar_label(ax.containers[0], padding=2)
ax.set_title("Menu Terlaris Sepekan")
ax.set_ylabel("Gelas terjual")
ax.set_ylim(0, 32)
plt.show()Grafik yang muncul memuat enam batang tegak yang terurut menurun: es kopi susu menempati posisi terdepan dengan 28 gelas, disusul kopi tubruk (22), matcha latte (19), es teh melati (15), teh tawar (12), dan cokelat panas yang terpendek dengan 9 gelas. Setiap batang diberi angka tepat di atas ujungnya, dan batang terpendek masih setara kira-kira sepertiga batang tertinggi — rasio yang sehat karena sumbu dimulai dari nol.
Ada tiga keputusan penting di balik blok tersebut:
- Baris 9 (
.sort_values(ascending=False)): pengurutan dilakukan sebelum menggambar, sehingga urutan kategori pada sumbu horizontal langsung mengikuti peringkat penjualan. - Baris 12 (
ax.bar_label(...)):ax.containers[0]memegang kumpulan batang yang baru digambar, danbar_labelmenuliskan nilainya di ujung tiap batang;padding=2memberi jarak agar angka tidak menempel pada batang. - Baris 14 (
ax.set_ylim(0, 32)): sumbu nilai dimulai dari nol dan diberi ruang sampai 32 agar label angka di atas batang tertinggi tidak terpotong tepi gambar.
Bar Chart Mendatar untuk Nama Panjang #
Sumbu horizontal memiliki ruang label yang jauh lebih lega daripada sumbu tegak. Ketika nama kategorinya panjang atau jumlahnya banyak, bar chart mendatar (horizontal bar) menghindari label yang bertumpuk atau terpaksa dimiringkan:
| Aspek | Bar tegak | Bar mendatar |
|---|---|---|
| Ruang label kategori | sempit, rawan bertumpuk atau miring | lega di sisi kiri |
| Cocok untuk | sedikit kategori dengan label pendek | banyak kategori atau label panjang |
| Kebiasaan membaca | kiri ke kanan | atas ke bawah, mulai dari terbesar |
| Contoh pemakaian | empat menu utama | dua puluh menu lengkap |
Kita gambar ulang data yang sama dalam orientasi mendatar:
import matplotlib.pyplot as plt
import pandas as pd
penjualan = pd.Series({
"es kopi susu": 28, "matcha latte": 19, "teh tawar": 12,
"cokelat panas": 9, "es teh melati": 15, "kopi tubruk": 22,
}).sort_values()
fig, ax = plt.subplots(figsize=(6, 3.5))
ax.barh(penjualan.index, penjualan.values, color="tab:blue")
ax.bar_label(ax.containers[0], padding=3)
ax.set_title("Menu Terlaris Sepekan")
ax.set_xlabel("Gelas terjual")
ax.set_xlim(0, 32)
plt.show()Gambar yang dihasilkan memuat enam batang mendatar: es kopi susu terpanjang di posisi paling atas memanjang sampai 28, disusul di bawahnya kopi tubruk (22), matcha latte (19), es teh melati (15), teh tawar (12), dan cokelat panas paling pendek di dasar dengan 9. Nama menu tertulis rata kanan di sisi kiri batang tanpa perlu dimiringkan, dan angka nilai menempel di ujung kanan tiap batang.
Perhatikan satu jebakan kecil pada blok tersebut: barh() menggambar kategori pertama di posisi paling bawah, sehingga pengurutan memakai sort_values() urutan naik — bukan turun. Dengan begitu nilai terbesar berakhir di posisi paling atas, dan daftar terbaca dari yang terlaris ke yang terendah persis seperti daftar peringkat pada umumnya.
Rangkuman #
- Grafik perbandingan dipakai ketika satu angka melekat pada satu kategori — biasanya hasil agregasi
groupby(); sebaiknya tidak lebih dari belasan kategori. - Urutkan batang menurun berdasarkan nilainya, kecuali kategori memiliki urutan alami (kepuasan, bulan) yang justru harus dipertahankan.
- Batang tegak cocok untuk kategori sedikit dengan label pendek; batang mendatar memberi ruang lega untuk label panjang dan daftar panjang.
ax.bar_label()menuliskan nilai di ujung batang sehingga pembaca tidak perlu menaksir dari garis kisi.- Sumbu nilai selalu dimulai dari nol; untuk
barh()gunakan urutan naik agar yang terbesar tampil paling atas.
Perbandingan antar kategori menghasilkan satu angka per kelompok, tetapi sering kali yang ingin kita lihat justru isi kelompoknya: bagaimana nilai-nilai tersebar di dalamnya. Keluarga grafik berikutnya menjawabnya — mari kita masuk ke chapter Grafik Distribusi.
Referensi #
- Matplotlib — Plot Types — contoh resmi bar chart tegak dan mendatar beserta variannya.
- Pandas — Intro Tutorials — tutorial resmi pandas, termasuk pengurutan dan agregasi yang menjadi bahan bakunya bar chart.