Diagram batang membandingkan kategori
Diagram batang menjawab "berapa banyak masing-masing?": satu batang per kategori, dan panjang batang menunjukkan nilai kategori itu. Di R, fungsi dasarnya adalah barplot(), dan input-nya cukup sebuah vector tinggi batang. Beri nama pada vector itu, maka nama-namanya menjadi label di bawah batang:
visits <- c(Mon = 42, Tue = 51, Wed = 47, Thu = 60, Fri = 78)
barplot(visits,
main = "Store visits by day",
ylab = "Visits")
Lima batang abu-abu berlabel nama hari, naik dari Senin yang sederhana sampai puncak di hari Jumat yang tingginya hampir dua kali lipat. Tidak ada yang perlu dipasang atau diatur: kalau kamu bisa membuat vector bernama, kamu bisa membuat grafiknya.
Editor yang bisa dijalankan di halaman ini hanya menampilkan output teks, jadi pemanggilan barplot() di sini adalah potongan kode statis untuk ditempel ke sesi R lokalmu. Tapi langkah penghitungan sebelumnya bisa dijalankan dengan baik, dan justru langkah itulah yang paling penting.
Alur kerja sebenarnya: table() dulu, barplot() kemudian
Dalam praktiknya, kamu jarang punya tinggi batang yang sudah rapi dan dihitung. Yang kamu punya adalah kolom mentah berisi label kategori (satu baris per jawaban survei, per pesanan, per pengguna), dan penghitungannya itulah pekerjaan yang sebenarnya. table() melakukannya dalam satu pemanggilan, dan hasilnya adalah vector hitungan bernama, persis seperti yang diinginkan barplot():
Lalu grafiknya cukup satu baris lagi:
barplot(sort(t, decreasing = TRUE),
main = "Survey responses",
ylab = "Count")
Dua langkah itu, table() lalu barplot(), adalah alur diagram batang yang paling umum di R. Mengurutkan tabel lebih dulu adalah peningkatan yang murah: batang yang diurutkan berdasarkan tinggi lebih cepat dibaca daripada batang yang diurutkan menurut abjad, kecuali kalau kategorinya punya urutan alami (hari, bulan, tingkat dosis). Dalam kasus itu, factor dengan level yang diurutkan dengan benar mencegah table() mengurutkannya menurut abjad. Untuk batang yang butuh agregasi sungguhan (jumlah atau rata-rata per kelompok, bukan hitungan baris), lakukan dulu langkah group-by-summarize lalu berikan hasilnya ke barplot().
Label dan gaya
Label biasanya berasal dari nama-nama vector, tapi names.arg menimpanya. Ini berguna saat kode dalam data tidak cocok untuk ditampilkan ke pembaca:
barplot(visits,
names.arg = c("Monday", "Tuesday", "Wednesday",
"Thursday", "Friday"),
col = "steelblue",
border = NA,
main = "Store visits by day",
las = 2)
colmengisi warna batang; berikan sebuah vector untuk mewarnai setiap batang secara terpisah, tapi tahan diri dari warna pelangi sebagai default. Warna seharusnya punya arti, misalnya menandai satu batang yang sedang kamu bahas.border = NAmenghapus garis tepi batang supaya tampak lebih bersih.las = 2memutar label sumbu sehingga tegak lurus terhadap sumbunya, solusi untuk nama kategori panjang yang saling bertumpuk. Gabungkan dengan margin bawah yang lebih besar (par(mar = c(8, 4, 4, 2))) kalau namanya benar-benar panjang.
Batang berkelompok dan bertumpuk dari matrix
Untuk menampilkan dua dimensi kategori sekaligus, misalnya penjualan per saluran per kuartal, berikan sebuah matrix ke barplot(). Setiap kolom menjadi satu posisi di sumbu kategori, dan baris-barisnya menjadi sub-batang:
sales <- matrix(c(12, 18, 15, 22, 20, 19, 24, 27),
nrow = 2,
dimnames = list(c("Online", "Retail"),
c("Q1", "Q2", "Q3", "Q4")))
# Grouped: rows stand next to each other within each quarter
barplot(sales, beside = TRUE,
col = c("steelblue", "orange"),
legend.text = rownames(sales),
main = "Sales by channel and quarter")
# Stacked: rows pile up into one total bar per quarter (the default)
barplot(sales, beside = FALSE,
col = c("steelblue", "orange"),
legend.text = rownames(sales))
beside = TRUE menempatkan kedua saluran berdampingan di dalam setiap kuartal, paling baik saat kamu ingin membandingkan saluran secara langsung. Default bertumpuk menonjolkan total per kuartal, dengan pembagiannya ditampilkan di dalam setiap batang; cara ini jujur untuk total, tapi membuat segmen di dalamnya sulit dibandingkan antarbatang karena titik dasarnya bergeser. legend.text = rownames(sales) menambahkan legenda yang membuat kedua versi bisa dibaca.
Satu tombol lagi: horiz = TRUE menata batang di sepanjang sumbu horizontal. Ini tata letak yang paling ramah untuk banyak kategori dengan nama panjang: setiap label berada di barisnya sendiri di sebelah batangnya, tanpa perlu diputar.
Diagram batang atau histogram?
Orang sering sekali tertukar antara keduanya, dan perbedaannya layak dipahami dalam tiga puluh detik: diagram batang membandingkan kategori yang terpisah. Sumbunya adalah sekumpulan label, batangnya berjarak, dan mengubah urutannya sah-sah saja. Histogram mengelompokkan satu variabel numerik. Sumbunya adalah skala kontinu, batangnya bersentuhan karena kelompoknya adalah interval yang berurutan, dan mengubah urutannya tidak masuk akal. Kalau kolommu berisi kata ("Yes", "Chrome", "Q3"), kamu butuh barplot(table(x)). Kalau berisi hasil pengukuran (tinggi badan, harga, waktu respons), kamu butuh histogram dan hist(x).
ggplot2: geom_col vs geom_bar
Versi ggplot2 hadir dalam dua geom, dibedakan berdasarkan apakah penghitungannya sudah dilakukan:
library(ggplot2)
# geom_bar(): raw observations in, counting done for you
ggplot(survey, aes(x = response)) +
geom_bar(fill = "steelblue")
# geom_col(): heights already computed, one row per bar
totals <- data.frame(day = c("Mon", "Tue", "Wed", "Thu", "Fri"),
visits = c(42, 51, 47, 60, 78))
ggplot(totals, aes(x = day, y = visits)) +
geom_col(fill = "steelblue")
geom_bar() adalah table() yang tertanam di dalam plot: fungsi ini menerima satu baris per observasi lalu menghitungnya. geom_col() menerima data yang sudah diagregasi dan memetakan kolom y ke tinggi batang, padanan dari barplot() klasik. Memberikan data yang sudah dihitung ke geom_bar() adalah jebakan standar bagi pemula: fungsi itu menghitung baris (masing-masing satu) sehingga setiap batang keluar dengan tinggi yang sama.
Yang kamu bawa pulang
barplot(heights)menggambar vector bernama, dantable(x)menghasilkan bentuk persis seperti itu dari data kategori mentah, jadibarplot(table(x))adalah idiom intinya.- Urutkan tabel (atau atur level factor) sebelum menggambar; urutan batang adalah bagian dari pesannya.
- Matrix menghasilkan batang berkelompok (
beside = TRUE) atau bertumpuk (default); tambahkanlegend.text = rownames(m). names.arg,col,las = 2, danhoriz = TRUEmengurus pelabelan; batang horizontal paling baik untuk nama yang panjang.- Kategori → diagram batang; kelompok numerik → histogram. Di ggplot2: baris mentah →
geom_bar(), tinggi yang sudah dihitung →geom_col().
Berikutnya: ggplot2 itu sendiri, tata bahasa yang membangun semua grafik ini, dan banyak lagi, dari beberapa komponen yang sama dan bisa disusun ulang.
Pertanyaan yang sering diajukan
Bagaimana cara membuat diagram batang di R?
Panggil barplot() pada sebuah vector tinggi batang. Beri nama pada vector itu, atau buat dengan table() yang hasilnya sudah bernama, maka setiap elemen menjadi satu batang berlabel: barplot(table(df$category)).
Bagaimana cara membuat barplot berkelompok atau bertumpuk di R?
Berikan sebuah matrix. Setiap kolom menjadi satu posisi di sumbu kategori; beside = TRUE menggambar baris-barisnya sebagai batang yang berdiri bersebelahan (berkelompok), sedangkan default beside = FALSE menumpuknya. Tambahkan legend.text = rownames(m) supaya pembaca bisa membedakan baris-barisnya.
Apa perbedaan barplot() dan hist() di R?
barplot() membandingkan kategori yang terpisah: satu batang per kategori, dan batangnya berjarak. hist() mengelompokkan satu variabel numerik ke dalam interval yang berurutan: batangnya bersentuhan karena sumbunya adalah skala kontinu. Kalau variabelmu berisi kata, kamu butuh barplot(table(x)); kalau berisi angka, kamu butuh hist(x).
Sebaiknya pakai geom_bar atau geom_col di ggplot2?
geom_bar() menghitung untukmu: berikan observasi mentah dan fungsi ini menghitung setiap kategori. geom_col() menggambar nilai yang sudah kamu hitung: berikan satu baris per batang plus satu kolom tinggi. Memberikan data yang sudah dihitung ke geom_bar() adalah kesalahan klasik; data seperti itu butuh geom_col().