Topik ini membahas skala (scale) dan label sebagai lapisan yang mengendalikan bagaimana pemetaan diterjemahkan dan dibaca. Pembahasan mencakup judul serta label sumbu melalui labs(), pengaturan tanda sumbu melalui scale_y_continuous(), warna manual untuk kategori berbahasa Indonesia, palet isian bawaan, dan pemutar koordinat coord_flip(). Setelah topik ini dipelajari, grafik dapat diberi keterangan lengkap sehingga dibaca benar tanpa penjelasan lisan di sebelahnya.
Judul dan label sumbu dengan labs()#
Label bawaan ggplot2 mengambil nama kolom, sehingga pemetaan aes(x = kelas, y = rata) menghasilkan sumbu bernama kelas dan rata. Nama kolom memang jujur, tetapi belum tentu berbahasa yang dipahami pembaca grafik. Fungsi labs() mengganti judul, subjudul, label sumbu, dan keterangan sumber data dalam satu pemanggilan.
Data yang dipakai adalah nilai ujian 18 siswa dari tiga kelas, dan rata-ratanya dihitung lebih dahulu dengan dplyr.
library(tidyverse)
ujian <- tibble(
kelas = rep(c("Kelas A", "Kelas B", "Kelas C"), each = 6),
nilai = c(78, 85, 91, 69, 74, 88,
81, 77, 84, 90, 72, 79,
65, 70, 76, 82, 68, 74)
)
rata <- ujian |>
group_by(kelas) |>
summarize(rata = mean(nilai))
rata── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.2.1 ✔ readr 2.2.0
✔ forcats 1.0.1 ✔ stringr 1.6.0
✔ ggplot2 4.0.3 ✔ tibble 3.3.1
✔ lubridate 1.9.5 ✔ tidyr 1.3.2
✔ purrr 1.2.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# A tibble: 3 × 2
kelas rata
<chr> <dbl>
1 Kelas A 80.8
2 Kelas B 80.5
3 Kelas C 72.5Grafik berikut merangkai labs() lengkap dengan skala isian dan tanda sumbunya.
p <- ggplot(rata, aes(x = kelas, y = rata, fill = kelas)) +
geom_col() +
scale_fill_brewer(palette = "Blues") +
scale_y_continuous(breaks = seq(0, 90, 30),
labels = paste0(seq(0, 90, 30), " poin")) +
labs(
title = "Rata-rata nilai ujian per kelas",
subtitle = "Enam siswa per kelas, satu mata pelajaran",
x = NULL,
y = "Nilai rata-rata",
caption = "Data nilai ujian 18 siswa"
)
ggsave("kelas-bar-label.svg", p, width = 5, height = 3.4)Argumen title dan subtitle menempatkan judul di atas grafik, x dan y mengganti label sumbu, sedangkan caption menaruh keterangan kecil di bawah kanan. Nilai x = NULL menghilangkan label sumbu x karena nama kelasnya sudah jelas tanpa keterangan tambahan. Warna batang berasal dari scale_fill_brewer(palette = "Blues"), yaitu palet isian berurut dari paket RColorBrewer yang membuat tiga tingkat kelas terbaca sebagai gradasi.
Mengatur tanda skala pada sumbu#
Tanda pada sumbu dikendalikan skala yang sesuai dengan kanalnya, yaitu scale_y_continuous() untuk sumbu y numerik dan scale_x_continuous() untuk sumbu x numerik. Argumen breaks menentukan posisi tanda, sedangkan labels menentukan tulisannya. Pada grafik di atas, seq(0, 90, 30) memilih tanda 0, 30, 60, dan 90, kemudian paste0(..., " poin") membentuk tulisannya menjadi 0 poin sampai 90 poin.
Vektor labels boleh berupa teks apa pun sepanjang panjangnya sama dengan breaks. Apabila tulisan bawaan sudah memadai, labels boleh ditiadakan dan hanya breaks yang diberikan. Sebaliknya, apabila keduanya diberikan dengan panjang berbeda, ggplot2 menolak grafiknya dengan pesan error, sehingga kedua vektor sebaiknya dibentuk dari satu panggilan seq() yang sama agar tidak pernah meleset.
Jangkauan sumbu juga diatur dari skala yang sama melalui argumen limits. Pemanggilan scale_y_continuous(limits = c(0, 90)) membatasi sumbu y pada rentang itu, dan nilai di luarnya tidak digambar. Batas yang ditetapkan pada skala berlaku untuk seluruh lapisan grafik, sehingga jangkauan sumbunya tetap konsisten.
Warna manual untuk kategori Indonesia#
Skala warna bawaan memakai nama tingkat apa adanya, dan nama itu biasanya sudah baik. Apabila warna tertentu harus dipasangkan dengan kategori tertentu, misalnya konsisten dengan laporan lain, scale_color_manual() memasangkannya secara eksplisit melalui vektor bernama, yaitu vektor yang setiap nilainya diberi nama tingkat kategori. Data sensor tiga ruang berikut dipakai untuk memperagakannya.
set.seed(7)
sensor <- tibble(
ruang = rep(c("Ruang A", "Ruang B", "Ruang C"), each = 10),
hari = rep(1:10, 3),
suhu = c(rnorm(10, 23.0, 0.5), rnorm(10, 27.0, 0.8), rnorm(10, 19.5, 0.6))
)
sensor |>
group_by(ruang) |>
summarize(rata = mean(suhu))# A tibble: 3 × 2
ruang rata
<chr> <dbl>
1 Ruang A 23.1
2 Ruang B 27.6
3 Ruang C 19.7p_warna <- ggplot(sensor, aes(x = hari, y = suhu, color = ruang)) +
geom_point(size = 2) +
scale_color_manual(values = c(
"Ruang A" = "#1b6ca8",
"Ruang B" = "#c44e52",
"Ruang C" = "#3d8b6d"
)) +
labs(x = "Hari pengukuran", y = "Suhu (°C)", color = "Ruang")
ggsave("suhu-warna-manual.svg", p_warna, width = 5, height = 3.2)Vektor bernama pada values memasangkan nama tingkat di sebelah kiri dengan kode warna di sebelah kanan, sehingga urutan penulisannya bebas dan pasangan tetap benar. Argumen color = "Ruang" pada labs() mengganti judul legenda, karena nama argumen pemetaan juga menjadi nama legendanya. Untuk kanal isian, pasangannya adalah scale_fill_manual(), dan pasangan ini harus cocok dengan kanal yang dipetakan agar skalanya benar-benar berlaku.
Memutar koordinat dengan coord_flip()#
coord_flip() menukar sumbu x dan sumbu y setelah seluruh perhitungan selesai, sehingga batang vertikal berubah menjadi batang mendatar. Pemanggilan p + coord_flip() pada grafik batang sebelumnya menghasilkan batang yang menjulur ke kanan dengan nama kelas tetap pada sumbu vertikalnya.
Pemutaran ini paling berguna ketika label kategori panjang. Label yang panjang, seperti nama lengkap mata pelajaran atau nama ruang, miring dan bertumpuk pada sumbu x grafik vertikal, sedangkan pada grafik mendatar semuanya terbaca lurus. coord_flip() juga menjaga perbandingan tinggi batang tetap benar karena penukaran terjadi pada tingkat koordinat, bukan pada data.
Penukaran itu terjadi pada tingkat tampilan, sehingga sumbu nilai yang kini mendatar tetap diatur oleh scale_y_continuous(), bukan oleh scale_x_continuous(). Apabila urutan kategori perlu dibalik pada grafik mendatar, faktor diatur ulang dengan forcats sebelum difacet atau digambar.
Kesalahan umum#
Kesalahan pertama adalah memberikan labels dengan panjang yang berbeda dari breaks. Pesan error `breaks` and `labels` must have the same length. muncul saat grafik digambar, dan perbaikannya membentuk kedua vektor dari panggilan seq() yang sama sebagaimana contoh grafik batang di atas.
Kesalahan kedua adalah memasangkan skala dengan kanal yang tidak dipetakan. Pemanggilan scale_fill_manual() pada grafik yang hanya memetakan color tidak berpengaruh apa pun karena tidak ada pemetaan isian yang perlu diterjemahkan. Skala dipilih sesuai kanalnya, yaitu pasangan color untuk titik dan garis serta pasangan fill untuk isian.
Kesalahan ketiga adalah menetapkan breaks di luar jangkauan data. Tanda yang berada di luar rentang sumbu tidak digambar dan tidak memunculkan pesan apa pun, sehingga sumbu tampak tanpa tanda tanpa sebab yang jelas. Rentang tanda diperiksa terhadap nilai data terkecil dan terbesar sebelum dipakai.
Ringkasan#
labs()mengganti judul, subjudul, label sumbu, judul legenda, dan keterangan sumber dalam satu pemanggilan.scale_y_continuous(breaks, labels)menentukan posisi dan tulisan tanda sumbu, dan kedua vektornya dibentuk dari satuseq()agar panjangnya selalu cocok.scale_color_manual()danscale_fill_manual()memasangkan kategori dengan warna melalui vektor bernama, sedangkanscale_fill_brewer()menyediakan palet berurut.coord_flip()menukar sumbu setelah perhitungan selesai, sehingga batang mendatar menjadi pilihan utama ketika label kategori panjang.
Referensi#
- ggplot2: Elegant Graphics for Data Analysis — tidyverse — Dokumentasi resmi labs, keluarga scale_*, dan coord_flip.
- R for Data Science, edisi ke-2 — Wickham, Çetinkaya-Rundel, Grolemund — Bab communication membahas label, skala, dan penataan grafik untuk pembaca.