Bar chart
bar · ComparisonMembandingkan jumlah antar kategori. Pilihan default, dan hampir selalu benar.
- bars ← jenis
- size ← dbh_cm (agg: count)
ax.barh(rekap.index, rekap.values, color="#1F6F4A")
ax.set_xlabel("Jumlah pohon")
Katalog jenis grafik yang tersedia di platform ini, palet warna beserta hasil pengukurannya, dan daftar kesalahan yang paling sering terjadi. Dibuat untuk dibuka sambil bekerja — tidak perlu mendaftar kursus apa pun.
Mana yang lebih besar, dan berapa urutannya?
Membandingkan jumlah antar kategori. Pilihan default, dan hampir selalu benar.
ax.barh(rekap.index, rekap.values, color="#1F6F4A")
ax.set_xlabel("Jumlah pohon")
Membandingkan beberapa seri di dalam tiap kategori.
df.pivot_table(index="kabupaten", columns="kondisi",
values="dbh_cm", aggfunc="count").plot.bar(ax=ax)
Profil banyak indikator untuk sedikit entitas.
# butuh proyeksi polar; pertimbangkan bar berkelompok dulu
Batang melingkar. Untuk data yang memang siklis, misalnya bulan.
ax = fig.add_subplot(projection='polar')
Dua besaran berlawanan arah dari satu sumbu tengah, misalnya tumbuh vs mati.
ax.barh(y, kiri * -1); ax.barh(y, kanan)
Bagaimana bentuk datanya -- di mana menumpuk, di mana ekornya?
Bentuk sebaran satu variabel angka. Grafik pertama untuk kolom angka apa pun.
ax.hist(df["dbh_cm"], bins=25, color="#2f7d55", edgecolor="white")
Membandingkan sebaran banyak kelompok sekaligus.
ax.boxplot(data, labels=urutan, patch_artist=True)
Banyak sebaran bertumpuk — enak untuk melihat pergeseran antar kelompok atau tahun.
# offset tiap kurva kde secara vertikal
Sebaran kumulatif. Menjawab “berapa persen di bawah 30 cm?” secara langsung.
ax.step(np.sort(x), np.arange(1, len(x)+1) / len(x))
Seperti boxplot tapi memperlihatkan bentuknya — berguna kalau sebarannya berpuncak dua.
ax.violinplot(data, showmedians=True)
Memeriksa apakah data mendekati normal sebelum memakai uji yang mengasumsikannya.
import scipy.stats as st; st.probplot(x, plot=ax)
Dugaan beserta selang kepercayaannya. Bentuk yang benar untuk hasil inventarisasi.
ax.errorbar(x, rata, yerr=1.96 * se, fmt="o", capsize=3)
Menampilkan tiap pengamatan. Jujur untuk data sedikit.
ax.scatter(x + jitter, y, s=8, alpha=0.4)
Struktur dua sisi — piramida umur, atau kelas diameter dua periode.
ax.barh(kelas, -kiri); ax.barh(kelas, kanan)
Scatter dengan ribuan titik yang sudah menumpuk jadi gumpalan.
ax.hexbin(x, y, gridsize=30, cmap="Greens")
Histogram yang dihaluskan; enak untuk menumpuk beberapa kelompok.
df.groupby("jenis")["dbh_cm"].plot.kde(ax=ax)
Sebaran jawaban skala (Likert) atau kategori berurut, per pengamatan.
# scatter dengan jitter pada sumbu kategori
Permukaan respons dua peubah. Jarang benar-benar dibutuhkan.
ax.plot_trisurf(x, y, z, cmap="viridis")
Bagian ini seberapa besar dari keseluruhan?
Total per kategori, sekaligus susunannya.
silang.plot.barh(stacked=True, ax=ax)
Membandingkan proporsi ketika totalnya sangat berbeda.
(silang.div(silang.sum(axis=1), axis=0) * 100).plot.barh(stacked=True, ax=ax)
Sekilas bagian terhadap keseluruhan, ketika satu irisan jelas mendominasi.
ax.pie(nilai, labels=label, autopct="%1.0f%%")
Sama seperti pie, dengan ruang tengah untuk total.
ax.pie(nilai, wedgeprops=dict(width=0.4))
Bagian terhadap keseluruhan yang bertingkat, ketika ukurannya sangat timpang.
import squarify; squarify.plot(sizes, label=label, ax=ax)
Hierarki melingkar. Bagus untuk memperlihatkan kedalaman bertingkat.
# plotly.express.sunburst
Penyusutan bertahap: plot direncanakan → disurvei → lolos validasi.
ax.barh(tahap, jumlah) # urut menurun, satu rona menggelap
Proporsi sebagai jumlah kotak. Lebih mudah dibaca orang awam daripada pie.
# 10x10 kotak, satu kotak = 1%
Apakah dua besaran bergerak bersama?
Hubungan dua besaran, dan bentuk hubungannya — bukan cuma koefisiennya.
ax.scatter(x, y, s=8, alpha=0.35, color="#2f7d55")
Scatter dengan besaran ketiga sebagai ukuran titik.
ax.scatter(x, y, s=nilai * 6, alpha=0.5)
Nilai pada perpotongan dua kategori. Bagus untuk matriks korelasi.
ax.imshow(matriks, cmap="Greens"); fig.colorbar(...)
Dua besaran yang bergerak bersama sepanjang waktu, jejaknya tergambar.
ax.plot(x, y, marker="o"); [ax.annotate(t, (xi, yi)) ...]
Banyak peubah sekaligus, mencari kelompok yang berperilaku mirip.
pd.plotting.parallel_coordinates(df, 'kelompok', ax=ax)
Tiga besaran sekaligus, ketika yang dicari adalah gumpalan.
ax = fig.add_subplot(projection="3d"); ax.scatter(x, y, z)
Permukaan model dengan titik pengamatan di sekitarnya — memeriksa kecocokan.
ax.plot_trisurf(...); ax.scatter(x, y, z)
Sisaan sebagai batang tegak dari permukaan model.
# garis vertikal dari z_duga ke z_amatan
Apa yang berubah, ke arah mana?
Perubahan sepanjang waktu. Default untuk deret waktu.
ax.plot(sub["tahun"], sub["hutan_ha"], marker="o", label=kab)
Satu deret waktu ketika besarannya, bukan cuma trennya, yang penting.
ax.fill_between(x, y, alpha=0.3); ax.plot(x, y)
Pola harian sepanjang tahun — hari hujan, hari kerja lapangan, titik panas.
# grid minggu x hari sebagai imshow
Komposisi yang berubah sepanjang waktu, ketika bentuk keseluruhan yang jadi cerita.
ax.stackplot(tahun, *lapis, baseline="wiggle")
Presentasi dan media sosial. Peringkat yang berubah, teranimasi.
# animasi; di luar cakupan matplotlib statis
Perubahan peringkat sepanjang waktu, bukan perubahan nilai.
# garis pada peringkat, sumbu Y dibalik
Data siklis yang memang melingkar: bulan dalam setahun, jam dalam sehari.
ax = fig.add_subplot(projection="polar"); ax.plot(theta, r)
Apa berpindah dari mana ke mana?
Perpindahan bervolume antar keadaan: tutupan 2015 → tutupan 2025.
# plotly.graph_objects.Sankey
Perpindahan dua arah antar sedikit kelompok.
# di luar matplotlib; pakai holoviews atau d3
Sankey dengan lebih dari dua tahap.
# plotly / d3-sankey bertahap
Hubungan berarah yang bukan hierarki.
import networkx as nx; nx.draw(G, ax=ax)
Perpindahan yang sama dengan Sankey, tapi angkanya terbaca tepat.
pd.crosstab(awal, akhir) # lalu imshow
Bagaimana satu angka berubah dari awal ke akhir, langkah demi langkah.
# batang dengan bottom=kumulatif berjalan
Hierarki yang sebenarnya: taksonomi, susunan kawasan.
# networkx atau scipy dendrogram
Satu titik asal menyebar ke banyak tujuan.
# busur dari satu titik
Di mana letaknya?
Nilai per wilayah administratif, ketika batasnya memang unit analisisnya.
gdf.plot(column='nilai', cmap='Greens', legend=True, ax=ax)
Besaran di satu titik — plot, desa, stasiun. Tidak bias oleh luas wilayah.
ax.scatter(lon, lat, s=nilai * 6); ax.set_aspect("equal")
Kadang jawabannya bukan grafik.
Ketika angka tepatnya yang dibutuhkan, atau ketika kelasnya lebih dari tujuh.
print(rekap.to_string())
Ketika jawabannya satu angka. Sering ini bentuk yang benar, dan hampir selalu dilewatkan.
print(f"{nilai:,.1f} m2/ha")
Langkah yang paling sering dilewati, dan paling murah. Kadang jawaban yang benar bukan grafik sama sekali.
| Datanya berupa… | Pakai | Bukan |
|---|---|---|
| Satu nilai sekarang, mungkin dengan trennya | Angka besar (stat tile), boleh dengan sparkline kecil | Grafik batang berisi satu batang |
| Beberapa angka utama | Deretan angka besar bersebelahan | Grafik batang berkelompok |
| Satu rasio terhadap batas | Meteran dengan jalur skala yang sama | Pie dengan dua irisan |
| Lebih dari sekitar tujuh kelas yang semuanya berarti | Tabel, atau tabel bersama grafik | Menambah warna |
| Angka tepat yang akan dikutip orang | Tabel | Grafik yang nilainya harus ditebak dari sumbu |
Putuskan ini sebelum memilih warna. Hampir semua grafik yang buruk memilih warna lebih dulu.
| Yang harus dilakukan pembaca | Bentuk default | Tugas warna |
|---|---|---|
| Membandingkan besaran, kecil ke besar | batang; heatmap untuk grid | sequential satu rona |
| Tren sepanjang waktu | garis; area untuk satu seri | sequential atau 1 kategori |
| Membedakan seri yang berbeda | batang berkelompok/bertumpuk, multi-garis | kategorikal |
| Satu seri adalah intinya, sisanya konteks | penekanan: satu diwarnai, sisanya abu-abu | 1 rona + abu |
| Di atas / di bawah suatu garis dasar | batang diverging, atau garis vs baseline | diverging |
| Bagian terhadap keseluruhan | batang bertumpuk (mendatar kalau namanya panjang) | kategorikal |
| Skala berurut (Likert, setuju↔tidak) | batang bertumpuk diverging, berpusat di netral | diverging |
| Sebelum → sesudah per item | dumbbell | 1 rona, 2 tingkat |
Jangan pernah menyelesaikan “serinya terlalu banyak” dengan menambah warna baru.
| Seri | Perlakuan |
|---|---|
1-3 | Warna saja sudah nyaman untuk semua orang; beri label langsung. |
4 | Bentuk bersebelahan (tumpukan, batang, garis) masih aman, tapi label langsung jadi wajib. Bentuk all-pairs — scatter, bubble, peta — berhenti di tiga. |
5-6 | Batas lunak; butuh legenda atau small multiples. |
7-8 | Langit-langit. Lewat itu, lipat sisanya jadi “Lainnya” atau pecah jadi beberapa panel. |
9+ | Tidak pernah dengan menambah warna baru. Warna ke-9 tidak bisa dibedakan dari yang sudah ada oleh pembaca dengan buta warna. |
render.js menyimpan tabel PALETTE_META yang menyatakan tiap
palet aman atau tidak. Pernyataan itu ditulis tangan, dan audit
2026-08-30 menemukan
6 di antaranya keliru — ke dua arah. Angka di
halaman ini hasil pengukuran, bukan pernyataan.
Ambang yang dipakai: ΔE OKLab ×100, protanopia dan deuteranopia disimulasikan (Machado-Oliveira-Fernandes 2009, severity 1,0). Pasangan bersebelahan ≥ 8; pita 6-8 hanya sah dengan label langsung; lantai penglihatan normal ≥ 15 dan itu gerbang keras.
| Tugas | Palet | Catatan |
|---|---|---|
| Identitas (kategori) | default | Dengan label langsung pada tiap seri. Batasi 5 seri; untuk scatter dan peta, 3. |
| Besaran (sequential) | mono | Satu rona, terang ke gelap. Ambil 6 langkah, bukan 8. |
| Besaran, data kontinu | viridis | Ketika grafiknya akan dicetak hitam-putih atau dibaca dari proyektor. |
| Kutub (diverging) | earth | Dua rona berlawanan dengan titik tengah netral. Titik tengah wajib nol. |
| Konteks yang diredam | slate | Untuk seri latar di grafik penekanan (emphasis). |
Ditandai tidak aman di render.js, padahal terukur paling terpisah dari semua palet kualitatif di sini. Kelemahannya bukan keterbacaan melainkan kontras: tiga warnanya terlalu terang di atas latar putih, jadi butuh garis tepi atau label.
Palet rumah. Tepat di batas bawah: ΔE 6,1 hanya sah kalau setiap seri diberi label langsung. Tiga warnanya juga di bawah lantai kroma, artinya terbaca abu-abu dan berhenti membedakan apa pun.
Okabe-Ito, set warna kategori yang paling banyak dipakai di dunia dan memang aman sebagai himpunan. Yang tidak aman adalah urutannya: slot 3 dan 4 bersebelahan pada ΔE 7,6 untuk deuteranopia. Pakai label langsung, atau batasi 3 seri.
Hijau muda, cocok untuk peta tutupan. Empat langkah teratasnya berjarak ΔL di bawah 0,06 sehingga menyatu; ambil 4 langkah saja.
Sama seperti viridis, dengan ujung gelap yang lebih pekat.
Satu rona biru, gelap ke terang. Pilihan paling aman untuk besaran. Dua langkah paling terang berjarak ΔL 0,05 -- terlalu dekat untuk dibedakan, jadi pakai 6 langkah, bukan 8.
Abu-abu netral. Untuk seri konteks yang sengaja diredam.
Perceptually uniform dan tetap terbaca dalam grayscale -- standar de facto untuk data kontinu. Ia memakai banyak rona secara sengaja, jadi aturan “satu rona” tidak berlaku untuknya.
Ditandai sequential tapi kecerahannya tidak menaik: 0,38 → 0,85 lalu turun ke 0,26. Sebagai ramp besaran ia membaca terbalik di dua langkah terakhir.
Sama: kecerahannya naik lalu turun. Bukan ramp.
Tidak monoton, dan rentang rona 84° -- terlalu lebar untuk ramp satu rona. Praktis ini palet kualitatif yang salah label.
Merah ke hijau dengan titik tengah krem: benar sebagai diverging, dan titik tengahnya memang netral. Untuk kategori, ΔE 10,0 pada penglihatan normal ada di bawah lantai.
Ditandai aman, terukur paling buruk kedua. Sebagai palet diverging ia benar -- coklat ke teal dengan titik tengah pucat -- dan di situlah tempatnya. Sebagai kategori ia gagal.
Yang paling bermasalah. ΔE 7,5 pada penglihatan normal berarti tidak seorang pun bisa memisahkan dua serinya, dan lima dari delapan warnanya di bawah lantai kroma. Jangan dipakai untuk identitas seri.
Lolos uji buta warna tapi gagal lantai penglihatan normal: dua hijau termudanya berjarak ΔE 10,5 untuk mata yang sehat sekalipun. Ini sebenarnya dua ramp (hijau dan ungu) yang dipakai sebagai kategori.
defaultDelapan rona Okabe-Ito yang sama, tidak satu pun warnanya diubah — hanya urutannya. Dicari menyeluruh atas seluruh 40.320 kemungkinan urutan.
| Urutan | ΔE buta warna | ΔE normal | Warna |
|---|---|---|---|
| sekarang | 7.6 | 20.0 | |
| usulan | 11.0 | 20.4 |
| Pemeriksaan | Isinya | Cara |
|---|---|---|
| Rona tetap dan berurut | Delapan keluarga warna dengan urutan yang tidak berubah. Urutan itulah mekanisme keamanannya. | struktural |
| Pita kecerahan | OKLCH L kira-kira 0,43-0,77 pada mode terang; 0,48-0,67 pada mode gelap. | terukur |
| Lantai kroma | OKLCH C ≥ 0,10. Di bawah itu sebuah rona terbaca abu-abu dan berhenti menandai identitas. | terukur |
| Keterpisahan buta warna | ΔE OKLab ×100 ≥ 8 di bawah simulasi protanopia dan deuteranopia. Pita 6-8 hanya sah dengan label langsung. | terukur |
| Lantai penglihatan normal | Pasangan terburuk ≥ 15 tanpa simulasi. Ini gerbang keras: label tidak memaafkannya. | terukur |
| Kontras terhadap latar | ≥ 3:1 untuk marka, kecuali nilainya terbaca dengan cara lain. | terukur |
Daftar periksa untuk gambar yang sudah jadi. Kalau grafikmu cocok dengan salah satu entri di bawah, ia keliru — dan perbaikannya disebutkan, bukan disiratkan.
Penjajaran kedua skala itu sewenang-wenang, jadi grafiknya mengarang korelasi yang tidak ada di data. Ini kesalahan grafik nomor satu.
Perbaikannya: Dua grafik terpisah, small multiples, atau indekskan keduanya ke basis yang sama (=100 di t0) pada satu sumbu.
Pembaca yang sudah belajar “Maros itu biru” jadi tersesat begitu satu kabupaten dihilangkan dan sisanya berganti warna.
Perbaikannya: Warna mengikuti entitas, bukan nomor barisnya. Yang bertahan mempertahankan ronanya.
Mewarnai tiap batang makin gelap makin besar, padahal kategorinya tidak berurut. Ini memakai satu-satunya kanal bebas untuk mengulang apa yang sudah dikatakan panjang batang.
Perbaikannya: Satu seri → satu warna untuk semua batang. Kategori berurut → ramp satu rona.
Rona tidak punya urutan bawaan, jadi pembaca tidak tahu mana yang lebih besar tanpa melihat legenda setiap kali.
Perbaikannya: Satu rona, terang ke gelap. Viridis kalau butuh perceptually uniform.
Titik tengah harus terbaca “tidak ada apa-apa”, dan kedua kutub harus terbaca berlawanan. Biru↔toska gagal keduanya.
Perbaikannya: Dua rona berlawanan panas/dingin, dengan abu-abu netral di tengah.
“Ini kelihatannya sudah cukup beda” tidak bisa diuji dan biasanya keliru.
Perbaikannya: Jalankan pemeriksa. Target ΔE ≥ 8; 6-8 hanya sah dengan label langsung.
Cara paling umum sebuah grafik meleset dari maksudnya.
Perbaikannya: Penekanan: satu seri berwarna, sisanya abu-abu. Atau tulis saja angkanya.
Mata manusia buruk membandingkan sudut. Dua irisan 24% dan 27% tampak sama.
Perbaikannya: Batang, atau angkanya langsung. Pie hanya untuk kesan sekilas, maksimal 5 irisan.
Kabupaten yang luas akan selalu tampak paling besar, karena luasnya sendiri ikut terbaca sebagai besaran.
Perbaikannya: Bagi dengan luas atau jumlah penduduk. Atau pakai peta simbol proporsional.
Nilai di samping tiap titik jadi berantakan dan akhirnya tidak dibaca siapa pun.
Perbaikannya: Label selektif: titik ujung, titik ekstrem, atau seri yang jadi inti cerita.
Garis putus-putus terbaca sebagai “proyeksi” atau “ambang”, padahal cuma kisi.
Perbaikannya: Kisi dan sumbu berupa garis rambut menerus, satu tingkat dari warna latar.
Menambah berat visual pada bagian yang bukan data.
Perbaikannya: Jarak 2px berwarna latar antar isian; cincin 2px berwarna latar pada marka bertumpuk.
Huruf pertama atau terakhir hilang, dan pembaca tidak sadar ada yang hilang.
Perbaikannya: Beri label di dalam marka hanya kalau muat beserta paddingnya; kalau tidak, pindahkan ke luar ujung batang atau ke tabel.
Tidak ada pada cetakan, tidak ada bagi pembaca layar, tidak ada pada tangkapan layar.
Perbaikannya: Tooltip menambah, tidak pernah menjadi gerbang. Setiap nilai juga terbaca dari label atau dari tabel kembarannya.
Pembaca dengan pembaca layar tidak mendapat apa pun dari SVG tanpa teks.
Perbaikannya: Setiap grafik punya versi tabel. Di kursus ini: cetak df.to_string() di bawah tiap gambar.
Sekitar 8% laki-laki tidak bisa memisahkan merah dari hijau.
Perbaikannya: Untuk ≥ 2 seri selalu ada legenda, dan sampai 4 seri juga diberi label langsung.
Theme Customization