Topik ini membahas facet, yaitu teknik memecah satu grafik menjadi beberapa panel (small multiples) dengan satu panel untuk setiap kelompok data. Pembahasan mencakup facet_wrap() untuk satu variabel kelompok, facet_grid() untuk dua variabel kelompok sekaligus, pengaturan skala antarpanel, dan pertimbangan kapan facet lebih tepat daripada satu grafik penuh. Setelah topik ini dipelajari, grafik dengan banyak kelompok dapat disusun menjadi panel-panel yang mudah dibaca tanpa menyalin kode untuk setiap kelompoknya.
facet_wrap untuk satu variabel kelompok#
facet_wrap() memecah grafik menjadi panel berurutan, dan setiap panel hanya memuat data dari satu tingkat variabel kelompoknya. Data yang dipakai adalah catatan sensor suhu tiga ruang selama sepuluh hari, dengan pembacaan pagi dan sore masing-masing sepuluh kali. Rentang suhu antar ruang berbeda jauh karena ketiganya memang berbeda pengaturan pendinginnya.
library(tidyverse)── 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 errorsset.seed(42)
sensor <- tibble(
ruang = rep(c("Ruang A", "Ruang B", "Ruang C"), each = 20),
waktu = rep(rep(c("pagi", "sore"), each = 10), 3),
hari = rep(1:10, 6),
suhu = c(rnorm(10, 23.0, 0.4), rnorm(10, 26.5, 0.6),
rnorm(10, 19.5, 0.5), rnorm(10, 21.0, 0.5),
rnorm(10, 27.0, 0.8), rnorm(10, 29.5, 0.9))
)
glimpse(sensor)Rows: 60
Columns: 4
$ ruang <chr> "Ruang A", "Ruang A", "Ruang A", "Ruang A", "Ruang A", "Ruang A"…
$ waktu <chr> "pagi", "pagi", "pagi", "pagi", "pagi", "pagi", "pagi", "pagi", …
$ hari <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1,…
$ suhu <dbl> 23.54838, 22.77412, 23.14525, 23.25315, 23.16171, 22.95755, 23.6…Formula ~ ruang, yaitu notasi berawalan tanda tilde pada R, menyatakan bahwa pemecahan hanya dilakukan menurut satu variabel. Grafik garis yang sama dibangun ulang untuk setiap panel, dan satu pemanggilan geom_line() sudah cukup untuk ketiganya.
p <- ggplot(sensor, aes(x = hari, y = suhu)) +
geom_line() +
geom_point(size = 1.5) +
facet_wrap(~ ruang, nrow = 1, scales = "free_y")
ggsave("suhu-facet.svg", p, width = 6, height = 3.0)Argumen scales = "free_y" memberi setiap panel skala y sendiri, sehingga pola harian tiap ruang terlihat pada rentangnya masing-masing. Apabila argumen itu tidak diberikan, seluruh panel memakai skala bersama dan pola ruang yang suhunya rendah akan tampak mendatar di bagian bawah. Susunan panel diatur dengan nrow dan ncol, dan label kelompoknya tampil sebagai strip, yaitu pita label kecil pada tepi atas setiap panel.
facet_grid untuk dua variabel kelompok#
facet_grid() menyusun panel pada bentuk matriks dengan dua variabel kelompok sekaligus. Formula waktu ~ ruang menempatkan tingkat waktu pada baris dan tingkat ruang pada kolom, sehingga jumlah panelnya menjadi hasil kali banyaknya tingkat keduanya.
p_grid <- ggplot(sensor, aes(x = hari, y = suhu)) +
geom_line() +
facet_grid(waktu ~ ruang)
ggsave("suhu-grid.svg", p_grid, width = 6, height = 3.6)Skala antarpanel bersifat bersama secara bawaan, sehingga perbandingan tinggi antar panel tetap adil. Formula satu arah juga sah, yaitu facet_grid(. ~ ruang) untuk panel berjajar pada satu baris atau facet_grid(waktu ~ .) untuk panel bertumpuk pada satu kolom. Titik pada formula menandai arah yang tidak dipakai. Pemilihan letak baris atau kolom menyesuaikan bentuk ruang gambarnya, yaitu ruang yang lebar lebih cocok diisi panel berjajar dan ruang yang sempit lebih cocok diisi panel bertumpuk.
Kapan facet lebih tepat daripada satu grafik penuh#
Facet paling membantu ketika jumlah kelompok membuat satu grafik penuh sulit dibaca. Pemetaan warna pada sepuluh kelompok memaksa pembaca mencocokkan sepuluh warna pada legenda, sedangkan facet menampilkan tiap kelompok pada panelnya sendiri dengan label strip yang terbaca langsung. Pertanyaan seperti “bagaimana pola tiap ruang” lebih cepat terjawab oleh panel daripada oleh warna.
Facet juga menghemat kode. Satu rangkaian ggplot() dan geom_line() menghasilkan panel untuk semua kelompok, sedangkan pendekatan satu grafik per kelompok mengulang pemanggilan yang sama. Perubahan pemetaan atau tema cukup dilakukan satu kali, dan seluruh panel ikut berubah.
Sebaliknya, facet kurang tepat ketika nilai antar kelompok harus dibandingkan dengan teliti pada sumbu yang sama dan jumlah kelompoknya sedikit. Grafik penuh dengan warna per kelompok menumpuk data pada satu sumbu, sehingga perbedaan kecil antar kelompok langsung terlihat. Facet memisahkan data ke panel berbeda, dan perbandingannya harus dilakukan secara visual dari panel ke panel.
Kesalahan umum#
Kesalahan pertama adalah menggunakan scales = "free" tanpa alasan. Skala yang bebas membuat panjang sumbu antar panel tidak sebanding, sehingga perbandingan tinggi antar panel menjadi menyesatkan. Argumen ini diberikan hanya apabila rentang antar kelompok memang berjauhan, sebagaimana contoh sensor tiga ruang di atas, dan hanya pada arah yang perlu dibebaskan.
Kesalahan kedua adalah memfacet variabel dengan terlalu banyak tingkat. Tiga puluh panel kecil dalam satu halaman tidak terbaca dan justru menyembunyikan pola. Apabila kelompoknya banyak, sebagian kelompok dipilih atau digabungkan terlebih dahulu, misalnya dengan fct_lump() dari forcats, sebelum difacet.
Kesalahan ketiga adalah menukar letak variabel pada formula facet_grid(). Sisi kiri formula menjadi baris dan sisi kanannya menjadi kolom, sehingga facet_grid(ruang ~ waktu) menghasilkan susunan yang berbeda dari facet_grid(waktu ~ ruang) dengan data yang sama. Susunan yang lebih mudah dibaca dipilih dengan mengingat sisi kiri tumpuk, sisi kanan berjajar.
Ringkasan#
facet_wrap(~ kelompok)memecah satu grafik menjadi panel per tingkat kelompok dengan satu pemanggilan geom untuk semuanya.facet_grid(baris ~ kolom)menyusun panel dalam matriks dua variabel, dan titik menandai arah yang tidak dipakai.- Argumen
scales = "free_y"memberi skala y tersendiri per panel, sedangkan skala bersama menjaga perbandingan antar panel tetap adil. - Facet paling tepat untuk kelompok yang banyak dan pertanyaan per kelompok, sedangkan grafik penuh lebih tepat untuk perbandingan teliti pada sumbu yang sama.
Referensi#
- ggplot2: Elegant Graphics for Data Analysis — tidyverse — Dokumentasi resmi facet_wrap, facet_grid, dan pengaturan skalanya.
- R for Data Science, edisi ke-2 — Wickham, Çetinkaya-Rundel, Grolemund — Bab data visualisation membahas facet sebagai pendamping pemetaan warna.