Menu

ggplot2 di R: panduan pemula grammar of graphics

Cara kerja ggplot2: model berpikir data + aes() + geom, perbedaan memetakan dan mengatur estetika, labs(), facet_wrap(), tema, dan menyimpan plot dengan ggsave().

ggplot2 membangun plot dari layer

ggplot2 adalah package plot yang paling banyak dipakai di R, dan alasan orang begitu menyukainya adalah sebuah gagasan desain: grammar of graphics (tata bahasa grafik). Base R memberimu satu fungsi per grafik (plot(), hist(), barplot()), masing-masing dengan argumennya sendiri. ggplot2 justru memberimu sekumpulan kecil bagian yang bisa disusun (sebuah dataset, pemetaan dari kolom ke properti visual, dan layer gambar) yang digabung dengan + menjadi grafik apa pun. Pelajari tata bahasanya sekali, maka setiap jenis grafik baru hanyalah kalimat yang sama dengan satu kata diganti. Sebagai bonus, pengaturan default-nya (panel abu-abu, sumbu yang masuk akal, legenda otomatis) sudah terlihat layak tanpa usaha mengatur gaya.

ggplot2 adalah package tambahan, jadi perlu dipasang sekali dan dimuat di setiap sesi:

install.packages("ggplot2")   # once, on your machine
library(ggplot2)              # at the top of every script that uses it

Satu harapan yang perlu kamu ketahui sejak awal: ggplot2 menginginkan data frame (bukan vector lepas), idealnya dalam format panjang yang rapi (tidy): satu baris per observasi, satu kolom per variabel. Kalau datamu berformat lebar, pivot menjadi format panjang dulu biasanya langsung menyelesaikan apa yang tampak seperti masalah plot.

Model berpikirnya: data, pemetaan, geometri

Setiap ggplot menjawab tiga pertanyaan, satu untuk setiap bagian:

  1. Data: data frame yang mana? ggplot(mtcars, ...)
  2. Pemetaan: kolom mana yang menggerakkan properti visual mana? aes(x = wt, y = hp)
  3. Geometri: bagaimana observasi digambar? + geom_point()

Berikut anatominya, token demi token:

ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point()
  • ggplot(mtcars, ...) memulai plot dengan mtcars sebagai data default-nya. Sendirian, ia hanya menggambar panel abu-abu kosong, karena belum ada layer.
  • aes(x = wt, y = hp) adalah pemetaan estetika: posisi horizontal berasal dari kolom wt, posisi vertikal dari hp. Perhatikan bahwa kamu menulis nama kolom apa adanya, bukan mtcars$wt; pemetaan dievaluasi di dalam data yang kamu berikan.
  • + geom_point() menambahkan layer yang menggambar setiap baris sebagai titik. + benar-benar berarti penambahan layer: plot adalah objek yang kamu bangun sedikit demi sedikit, dan kamu bisa terus menambah (geom lain, label, tema), masing-masing dengan + lagi.

Jalankan dan kamu mendapat scatter plot berat vs tenaga kuda yang sama seperti versi base R di panduan scatter plot, di atas panel abu-abu dengan garis kisi putih. Ganti geom_point() dengan geom_line(), maka pemetaan yang sama menjadi grafik garis. Itulah tata bahasanya bekerja.

Geom yang benar-benar akan kamu pakai

Selusin geom mencakup hampir semua pekerjaan sehari-hari:

geom_point()       # scatter plot: two numeric variables
geom_line()        # line chart: trends over an ordered variable
geom_col()         # bar chart from pre-computed heights (needs y)
geom_bar()         # bar chart that counts raw rows for you (no y)
geom_histogram()   # distribution of one numeric variable (set binwidth)
geom_boxplot()     # distributions compared across groups
geom_smooth()      # fitted trend line; method = "lm" for straight

Layer bisa ditumpuk, dan di situlah ggplot2 mulai mengalahkan base R dalam hal ekspresi: geom_point() + geom_smooth(method = "lm") adalah scatter plot dengan garis regresi dan pita kepercayaan, dalam satu baris yang mudah dibaca. Karena plot adalah objek, kamu juga bisa menyimpan dasarnya lalu membuat cabang darinya:

p <- ggplot(mtcars, aes(x = wt, y = hp)) + geom_point()

p + geom_smooth(method = "lm")   # one variant
p + geom_smooth()                # another (loess curve)

Memetakan vs mengatur: kebingungan klasik aes()

Satu kesalahan yang dibuat setiap pemula ggplot2, biasanya di minggu pertama: menaruh warna harfiah di dalam aes(). Aturannya singkat, di dalam aes() berarti "berubah mengikuti data"; di luar berarti "pengaturan tetap", dan kedua penempatan itu melakukan hal yang benar-benar berbeda:

# MAPPING: color varies by a column - each cylinder count gets its own
# color, and a legend appears automatically
ggplot(mtcars, aes(x = wt, y = hp, color = factor(cyl))) +
    geom_point(size = 2)

# SETTING: every point is literally steelblue - no legend, no mapping
ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point(color = "steelblue", size = 2)

Dan jebakannya sendiri:

# WRONG: "blue" inside aes() is treated as data, not as a color
ggplot(mtcars, aes(x = wt, y = hp, color = "blue")) +
    geom_point()

Kode ini menggambar titik berwarna merah muda salmon dengan legenda yang satu-satunya isinya berlabel "blue". Alasannya: aes() memetakan kolom ke properti, jadi color = "blue" membuat kolom palsu dengan satu kategori yang nilainya kata "blue" di semua baris, dan ggplot memberi kategori itu warna default pertamanya, yang kebetulan salmon kemerahan. Kalau maksudmu "buat titiknya biru", warnanya ditaruh di luar pemetaan: geom_point(color = "blue"). Aturan yang sama berlaku untuk size, shape, fill, dan alpha. (Perhatikan juga factor(cyl) di contoh pemetaan: cyl bersifat numerik, dan membungkusnya dengan factor() meminta warna berbeda untuk setiap kelompok, bukan gradasi warna yang kontinu.)

Label, facet, dan tema

labs() memberi nama pada semuanya di satu tempat, dan plot belum selesai sebelum punya label yang sungguhan:

ggplot(mtcars, aes(x = wt, y = hp, color = factor(cyl))) +
    geom_point(size = 2) +
    labs(title = "Horsepower vs. weight",
         x     = "Weight (1000 lbs)",
         y     = "Horsepower",
         color = "Cylinders")

Facet adalah fitur unggulan ggplot2: memecah satu plot menjadi beberapa plot kecil, satu panel per kelompok, dengan sumbu bersama sehingga panel-panelnya bisa dibandingkan dengan jujur:

ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point() +
    facet_wrap(~ cyl)

Tiga panel muncul, masing-masing untuk mobil 4, 6, dan 8 silinder, ditata dalam kisi dengan nilai kelompoknya tertulis di atas setiap panel. Di base R, ini adalah aksi akrobat par(mfrow) dengan batas sumbu yang diatur manual; di sini cukup satu baris. Facet paling cocok dengan data yang rapi, itulah sebabnya ggplot2 berpasangan begitu alami dengan pipeline dplyr: saring dan ringkas, lalu alirkan hasilnya langsung ke ggplot().

Tema mengubah gaya semua elemen non-data dalam satu pemanggilan: + theme_minimal() (latar putih yang bersih), + theme_bw(), + theme_classic() (hanya sumbu, tanpa kisi), atau default abu-abu. Pilih satu per proyek dan tetap konsisten: laporan yang semua gambarnya memakai tema yang sama terbaca sebagai satu dokumen, bukan buku tempelan.

Menyimpan dengan ggsave(), dan kapan base R masih cukup

ggsave() menulis plot terakhir ke disk, menebak format dari ekstensi file-nya:

ggsave("hp-vs-weight.png", width = 8, height = 5)          # last plot shown
ggsave("hp-vs-weight.pdf", plot = p, width = 8, height = 5) # a saved object

width dan height secara default dalam inci; atur secara eksplisit, karena ukuran huruf mengikuti dimensi output dan default-nya jarang cocok dengan tempat gambar itu akan dipakai.

Soal kapan perlu repot: untuk melihat satu variabel selama lima detik saat analisis, plot() dan kawan-kawannya di base R lebih sedikit ketikan dan tanpa dependensi; tidak ada hadiah untuk memakai ggplot2 di mana-mana. ggplot2 layak dipakai begitu sebuah gambar melibatkan kelompok, legenda, facet, atau pembaca: tata bahasanya bisa menangani kerumitan yang hanya bisa ditangani plot dasar dengan susah payah.

Yang kamu bawa pulang

  • ggplot2 menyusun setiap grafik dari data + pemetaan aes() + layer geom, disambung dengan +; pelajari tata bahasanya sekali, pakai ulang untuk setiap jenis grafik.
  • aes() memetakan kolom ke properti visual, dengan nama kolom apa adanya yang dievaluasi di dalam data frame-mu.
  • Di dalam aes() = berubah mengikuti data (dan mendapat legenda); di luar = pengaturan tetap. aes(color = "blue") adalah bug klasiknya.
  • labs() untuk judul, facet_wrap(~ group) untuk beberapa plot kecil, theme_minimal() dan kawan-kawannya untuk gaya, ggsave() dengan dimensi eksplisit untuk ekspor.
  • Melihat sekilas sendirian: base R. Kelompok, facet, atau pembaca: ggplot2.

Itu menutup bab plot. Dari sini, langkah berikutnya yang wajar adalah statistik deskriptif, memberi angka pada bentuk-bentuk yang diperlihatkan plot ini.

Pertanyaan yang sering diajukan

Apa itu ggplot2 di R?

ggplot2 adalah package plot paling populer di R. Alih-alih satu fungsi untuk setiap jenis grafik, kamu menyusun setiap plot dari tiga bagian yang sama: sebuah data frame, pemetaan aes() dari kolom ke properti visual, dan satu atau lebih layer geom_*(), yang disambung dengan +. ggplot2 adalah bagian dari tidyverse.

Bagaimana cara memasang ggplot2?

Jalankan install.packages("ggplot2") sekali, lalu library(ggplot2) di bagian atas setiap skrip yang memakainya. Memasang menaruh package di komputermu; library() memuatnya ke sesi saat ini.

Apa fungsi aes() di ggplot2?

aes() memetakan kolom-kolom datamu ke properti visual: aes(x = wt, y = hp, color = factor(cyl)) berarti posisi horizontal berasal dari wt, posisi vertikal dari hp, dan warna titik dari jumlah silinder. Apa pun di dalam aes() berubah mengikuti data; apa pun di luarnya adalah pengaturan tetap.

Kenapa titik-titik ggplot-ku tidak berwarna seperti yang kuminta?

Kamu menaruh warnanya di dalam aes(): aes(color = "blue") tidak mengatur warna, melainkan memetakan kategori buatan bernama "blue", sehingga ggplot memilih warna default-nya sendiri dan menambahkan legenda. Untuk mengatur warna secara harfiah, taruh di luar pemetaan: geom_point(color = "blue").

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai