plot(x, y, type = ..., ...)Praktikum Pemrograman Statistika
Plot Like a Pro: Visualisasi Data R yang Keren dan Informatif
Bukan Sekadar Angka, Saatnya Bercerita Lewat Grafik
Salah satu kekuatan utama bahasa pemrograman R dibandingkan software statistika lainnya adalah kemampuannya dalam menghasilkan grafik yang kaya, fleksibel, dan estetik. R tidak hanya mampu menampilkan data dalam bentuk visual untuk keperluan eksplorasi awal, tetapi juga sangat andal untuk menyajikan grafik diagnostik model, hingga visualisasi hasil akhir yang layak dipublikasikan di jurnal ilmiah. Visualisasi ini membantu kita memahami pola, tren, dan anomali yang sering kali tersembunyi di balik deretan angka.
Dalam ekosistem R, terdapat setidaknya tiga sistem utama grafik yang umum digunakan: base R graphics, lattice, dan ggplot2. Ketiganya menawarkan filosofi, sintaks, dan kekuatan yang berbeda. Base graphics lebih intuitif dan langsung, lattice unggul untuk grafik multivariat, sementara ggplot2 hadir dengan pendekatan “Grammar of Graphics” yang modular dan powerful.
Base R Graphics
Untuk memulai eksplorasi grafik di R, kita akan menggunakan fungsi paling dasar dalam sistem base R, yaitu plot(). Fungsi ini sangat fleksibel dan dapat digunakan untuk berbagai jenis grafik seperti scatter plot, line chart, maupun kombinasi keduanya. Melalui fungsi plot(), kamu bisa membangun visualisasi tahap demi tahap—mulai dari menampilkan titik atau garis, menambahkan elemen visual lainnya seperti legenda, teks, dan garis bantu.
Fungsi Dasar: plot()
Sintaks umum:
Parameter type menentukan jenis grafik yang ingin ditampilkan:
p→ Menampilkan titik (points) saja. (default)l→ Menampilkan garis (lines) saja.b→ Menampilkan titik dan garis secara bersamaan.c→ Menampilkan garis saja dari “b” (tanpa titik).o→ Menampilkan titik dan garis secara tumpang tindih (overplotted).h→ Menampilkan garis vertikal seperti histogram (high-density lines).s→ Menampilkan grafik tangga dengan langkah horizontal lebih dahulu (stair steps).S→ Menampilkan grafik tangga dengan langkah vertikal lebih dahulu.n→ Tidak menampilkan apa-apa, hanya menyiapkan area grafik (berguna untuk menambahkan elemen secara manual).
Semisal, kita ingin membuat plot seperti berikut:
Pertama, kita akan membuat data simulasi sederhana menggunakan rnorm(), yaitu bilangan acak dari distribusi normal. Data ini akan dibagi menjadi dua bagian: data awal (40 titik) dan data baru (10 titik). Berikut kodenya:
# Set seed agar hasil reproducible
set.seed(123)
# Data awal
x <- 1:40
y <- rnorm(40, mean = 5, sd = 1)
# Data baru
x1 <- 41:50
y1 <- rnorm(10, mean = 5, sd = 1)Kita kemudian membuat plot awal menggunakan fungsi plot() tanpa menambahkan elemen visual apa pun.
# Plot data awal
plot(
x, y
)Hasilnya masih berupa plot sangat sederhana tanpa label atau pewarnaan. Agar lebih informatif dan menarik, kita bisa menambahkan beberapa parameter styling seperti judul, label sumbu, warna, ukuran titik, dan batas sumbu.
# Plot data awal (diperindah)
plot(
x, y, type = "p",
xlab = "Sumbu x",
ylab = "Sumbu y",
main = "Bilangan Acak Normal",
col = topo.colors(40), # pewarnaan gradasi
pch = 16, # jenis simbol
cex = 2, # ukuran simbol
xlim = c(0, 50),
ylim = c(2.5, 7.5)
)Pada kode di atas, kita menggunakan beberapa argumen untuk membuat plot menjadi lebih informatif dan menarik:
xdanyadalah vektor data yang ingin kita visualisasikan. Dalam hal ini,xberisi urutan 1 sampai 40, danyadalah bilangan acak dari distribusi normal.type = "p"menunjukkan bahwa grafik yang ditampilkan berupa titik-titik (points). Ini adalah bentuk plot default dan paling umum untuk scatter plot.xlabdanylabdigunakan untuk memberi label sumbu-x dan sumbu-y, agar pembaca grafik tahu apa makna masing-masing sumbu.mainmemberikan judul grafik yang akan ditampilkan di bagian atas plot.col = topo.colors(40)menghasilkan warna gradasi sebanyak 40 warna menggunakan palettopo.colors(), sehingga setiap titik punya warna yang berbeda.pch = 16menetapkan jenis simbol yang digunakan untuk titik, dalam hal ini 16 adalah lingkaran solid (titik penuh).cex = 2mengatur ukuran simbol titik menjadi dua kali lebih besar dari default, agar titik-titik lebih mudah terlihat.xlim = c(0, 50)danylim = c(2.5, 7.5)mengatur batas sumbu-x dan sumbu-y, sehingga area tampilan grafik lebih terkontrol dan konsisten untuk perbandingan.
Setelah membuat plot dari data awal, kita bisa menambahkan titik-titik data baru ke dalam grafik yang sama. Dalam R base graphics, ini dilakukan dengan fungsi points(), yaitu fungsi untuk menambah titik ke plot yang sudah ada, tanpa menghapus plot yang sudah tergambar.
# Plot data awal
plot(
x, y, type = "p",
xlab = "Sumbu x",
ylab = "Sumbu y",
main = "Bilangan Acak Normal",
col = topo.colors(40),
pch = 16, cex = 2,
xlim = c(0, 50), ylim = c(2.5, 7.5)
)
# Tambahkan titik data baru
points(x1, y1, cex = 2)Fungsi points(x1, y1) digunakan untuk menambahkan titik ke grafik yang sudah ditampilkan sebelumnya. Argumen cex = 2 digunakan agar ukuran titik data baru setara dengan titik data awal. Karena tidak ada warna (col) atau bentuk (pch) yang ditentukan secara eksplisit, maka titik data baru akan menggunakan default, yaitu lingkaran kosong berwarna hitam.
Agar grafik lebih mudah dibaca dan diinterpretasikan, kita dapat menambahkan garis bantu ke dalam plot. Fungsi abline() di R digunakan untuk menambahkan garis lurus pada grafik yang sudah ditampilkan sebelumnya. Garis ini bisa berupa:
- Garis vertikal (
v = ...) - Garis horizontal (
h = ...) - Garis dengan persamaan linear \(y=a+b\times x\) (gunakan
a = ..., b = ...)
# Plot data awal
plot(
x, y, type = "p",
xlab = "Sumbu x",
ylab = "Sumbu y",
main = "Bilangan Acak Normal",
col = topo.colors(40),
pch = 16, cex = 2,
xlim = c(0, 50), ylim = c(2.5, 7.5)
)
# Tambahkan titik data baru
points(x1, y1, cex = 2)
# Garis bantu:
abline(v = 40.2, col = "blue") # Garis vertikal di x = 40.2
abline(h = mean(y), col = "red", lwd = 2.5) # Garis horizontal pada rata-rata y
abline(a = 2, b = 1/10, col = "purple", # Garis linear dengan y = 2 + 0.1x
lwd = 2, lty = 2)abline(v = 40.2, col = "blue")untuk menambahkan garis vertikal di posisi x = 40.2. Bisa digunakan untuk membatasi atau memisahkan bagian plot, misalnya antara data awal dan data baru.abline(h = mean(y), col = "red", lwd = 2.5)untuk menambahkan garis horizontal di posisi rata-rata dari data awal y. Ini sering digunakan untuk menunjukkan nilai tengah (baseline) dari distribusi.abline(a = 2, b = 1/10, col = "purple", lwd = 2, lty = 2)untuk M=menambahkan garis lurus dengan persamaan \(y=2+0.1x\). Cocok untuk menampilkan prediksi, batas teoritis, atau garis tren. Argumen lty = 2 menjadikan garis putus-putus (dashed).
Selain garis bantu, kita juga bisa menambahkan panah untuk memberi penekanan visual terhadap bagian tertentu dari grafik. Fungsi arrows() dalam base R digunakan untuk menggambar garis berarah dari titik asal ke titik tujuan.
# Plot data awal
plot(
x, y, type = "p",
xlab = "Sumbu x",
ylab = "Sumbu y",
main = "Bilangan Acak Normal",
col = topo.colors(40),
pch = 16, cex = 2,
xlim = c(0, 50), ylim = c(2.5, 7.5)
)
# Tambahkan titik data baru
points(x1, y1, cex = 2)
# Garis bantu:
abline(v = 40.2, col = "blue")
abline(h = mean(y), col = "red", lwd = 2.5)
abline(a = 2, b = 1/10, col = "purple",
lwd = 2, lty = 2)
# Tambahkan panah
arrows(x0 = 30, y0 = 3.5, x1 = 40, y1 = mean(y) - 0.1, lwd = 2)x0 = 30, y0 = 3.5adalah titik awal panah.x1 = 40, y1 = mean(y) - 0.1adalah titik tujuan panah, di sekitar garis horizontal rata-rata.lwd = 2adalah Ketebalan garis panah.
Secara default, panah diarahkan dari \((x_0, y_0)\) ke \((x_1, y_1)\). Jika kita ingin menambahkan panah ganda (kedua ujungnya) atau mengganti gaya kepala panah, kita bisa mengeksplorasi penggunaan argumen seperti angle, length, code, dll.
Setelah membuat plot lengkap dengan titik, garis, dan panah, kita bisa menyisipkan teks penjelas langsung ke dalam grafik menggunakan fungsi text(). Ini sangat berguna untuk memberi label manual pada bagian penting grafik, menjelaskan elemen yang tidak dijelaskan oleh sumbu atau legenda serta menambahkan konteks visual secara langsung.
# Plot data awal
plot(
x, y, type = "p",
xlab = "Sumbu x",
ylab = "Sumbu y",
main = "Bilangan Acak Normal",
col = topo.colors(40),
pch = 16, cex = 2,
xlim = c(0, 50), ylim = c(2.5, 7.5)
)
# Tambahkan titik data baru
points(x1, y1, cex = 2)
# Garis bantu:
abline(v = 40.2, col = "blue")
abline(h = mean(y), col = "red", lwd = 2.5)
abline(a = 2, b = 1/10, col = "purple",
lwd = 2, lty = 2)
# Tambahkan panah
arrows(x0 = 30, y0 = 3.5, x1 = 40, y1 = mean(y) - 0.1, lwd = 2)
# Tambahkan teks
text(x = 29, y = 3.3, labels = "Titik potong", cex = 0.7)
text(x = 3, y = 7.3, labels = "Data awal", cex = 0.7)
text(x = 46, y = 7.3, labels = "Data baru", cex = 0.7)Untuk visualisasi berikutnya, kita akan menggunakan dataset bawaan R bernama mtcars, yang berisi informasi tentang spesifikasi dan performa beberapa mobil dari majalah Motor Trend tahun 1974. Dataset ini sering digunakan dalam analisis eksplorasi karena memiliki kombinasi variabel numerik dan kategorik.
Dataset ini sudah tersedia secara default di R, jadi kita tidak perlu mengimpor file dari luar. Cukup jalankan kode berikut untuk melihat dan mengakses data:
# Akses data mtcars
data("mtcars")
head(mtcars)Dataset mtcars berisi 32 observasi (mobil) dengan 11 variabel, yaitu:
| Variabel | Deskripsi |
|---|---|
mpg |
Miles per gallon (efisiensi bahan bakar) |
cyl |
Jumlah silinder |
disp |
Displacement (cu in) |
hp |
Gross horsepower |
drat |
Rear axle ratio |
wt |
Berat (1000 lbs) |
qsec |
Waktu 1/4 mil (detik) |
vs |
Tipe mesin (0 = V-shaped, 1 = straight) |
am |
Tipe transmisi (0 = otomatis, 1 = manual) |
gear |
Jumlah gigi maju |
carb |
Jumlah karburator |
Histogram
Histogram adalah jenis grafik yang digunakan untuk menampilkan distribusi frekuensi dari variabel numerik. Grafik ini membagi rentang nilai menjadi interval (bin), lalu menghitung berapa banyak observasi yang jatuh dalam setiap interval tersebut.
Dalam contoh ini, kita akan menggunakan variabel mpg. Variabel mpg (miles per gallon) adalah ukuran efisiensi bahan bakar, yaitu berapa mil yang bisa ditempuh mobil per satu galon bensin. Karena mpg merupakan data numerik kontinu, maka sangat cocok divisualisasikan dalam bentuk histogram.
Pada tahap pertama ini, kita hanya menggunakan fungsi dasar hist() untuk melihat distribusi mpg secara cepat. Grafik yang muncul akan menggunakan pengaturan default dari R. Tampilan grafik masih sangat sederhana, namun cukup untuk memberikan gambaran awal pola distribusi data.
hist(mtcars$mpg)Karena histogram default terlihat polos dan minim konteks, kita bisa meningkatkan tampilannya agar lebih informatif dan menarik. Beberapa hal yang kita tambahkan adalah judul grafik (main), label sumbu-x (xlab), pewarnaan batang histogram (col), penghilangan garis batas batang (border). Penyesuaian ini penting untuk presentasi data yang lebih komunikatif, terutama saat grafik akan ditampilkan dalam laporan atau presentasi
hist(mtcars$mpg,
main = "Distribusi Efisiensi Bahan Bakar",
xlab = "Miles per Gallon (mpg)",
col = "skyblue",
border = "white")Pada histogram sebelumnya, jumlah bin ditentukan secara otomatis oleh R. Namun, kadang jumlah ini terlalu banyak atau terlalu sedikit, sehingga tidak memberikan representasi yang optimal terhadap distribusi data. Dengan menggunakan argumen breaks, kita bisa mengatur jumlah bin secara manual. Misalnya, kita ingin hanya ada 5 interval saja:
hist(mtcars$mpg,
breaks = 5,
main = "Histogram mpg dengan 5 Bin",
xlab = "Miles per Gallon",
col = "lightgreen",
border = "gray40")Penggunaan breaks = 5 membuat histogram hanya memiliki 5 batang. Ini dapat membantu menyederhanakan tampilan grafik atau menyesuaikan dengan jumlah kategori tertentu. Namun, perlu diingat bahwa memilih jumlah bin yang terlalu sedikit bisa mengaburkan pola, sementara terlalu banyak bisa membuat grafik sulit dibaca.
Bar plot
Bar plot (diagram batang) digunakan untuk menampilkan data kategorik, yaitu data yang terbagi ke dalam beberapa kelompok atau kategori. Tidak seperti histogram yang digunakan untuk data numerik kontinu, bar plot cocok digunakan untuk frekuensi kategori yang diskrit dan terbatas.
Contoh umum: kita ingin mengetahui jumlah mobil berdasarkan jumlah silinder (cyl). Variabel cyl memiliki nilai 4, 6, dan 8, yang merepresentasikan jenis mesin mobil. Sebelum membuat barplot, kita perlu menghitung jumlah (frekuensi) untuk setiap kategori dalam variabel cyl. Ini bisa dilakukan dengan fungsi table().
counts.cyl <- table(mtcars$cyl)
counts.cyl
4 6 8
11 7 14
Kita gunakan fungsi barplot() untuk membuat grafik batang dari data tersebut:
barplot(counts.cyl)Agar lebih informatif dan menarik secara visual, kita bisa menambahkan:
barplot(
counts.cyl,
col = c("#ffd166", "#06d6a0", "#118ab2"), # Warna kustom
legend.text = rownames(counts.cyl), # Legenda kategori
cex.names = 0.8 # Ukuran label
)Kita juga bisa menggunakan legend.text = TRUE untuk menampilkan nama legenda secara otomatis. Jika ingin menampilkan diagram batang secara horizontal, cukup tambahkan argumen horiz = TRUE pada fungsi barplot().
Scatter plot
Scatter plot atau diagram pencar adalah jenis grafik yang digunakan untuk menampilkan hubungan antara dua variabel numerik. Grafik ini sangat berguna untuk melihat pola, tren, atau korelasi antar variabel.
Kita bisa membuat scatter plot dari fungsi matematika, misalnya fungsi sinus berikut:
# Membuat vektor x dan y
x <- seq(from = -2*pi, to = 2*pi, length.out = 100)
y <- 2 * sin(x)Pada plot di bawah, kita membuat 100 titik dari fungsi \(y=2sin(x)\) untuk \(x\) dari \(−2\pi\) hingga \(2\pi\). Ini membantu memvisualisasikan bentuk gelombang sinus.
# Plot x vs y
plot(x, y,
main = "Grafik Fungsi y = 2sin(x)",
xlab = "x", ylab = "y",
type = "p", pch = 19, col = "blue")Selain fungsi matematis, scatter plot juga sangat berguna untuk data observasi. Misalnya, kita ingin melihat hubungan antara hp (horsepower) dan mpg (miles per gallon).
plot(mtcars$hp, mtcars$mpg,
main = "Hubungan antara Horsepower dan Efisiensi Bahan Bakar",
xlab = "Horsepower (hp)",
ylab = "Miles per Gallon (mpg)",
pch = 16, col = "darkgreen")Grafik ini memperlihatkan bahwa secara umum, semakin besar horsepower mobil, semakin rendah efisiensi bahan bakarnya — sebuah pola negatif yang umum dalam dunia otomotif.
Line Plot
Line plot atau grafik garis digunakan untuk menampilkan hubungan antar nilai numerik secara berurutan, misalnya urutan waktu atau indeks. Grafik ini cocok digunakan untuk:
- Menampilkan tren data dari waktu ke waktu (misalnya: suhu harian, harga saham, dll),
- Memvisualisasikan bentuk fungsi matematis,
- Menghubungkan titik-titik pengamatan agar pola lebih mudah terlihat.
# Grafik garis
plot(x, y, type = "l",
main = "Grafik y = sin(x)",
xlab = "x", ylab = "y",
col = "blue", lwd = 2)Tipe h membuat garis vertikal dari sumbu-x ke setiap nilai y. Ini berguna untuk menampilkan spike chart atau bentuk visual mirip batang tipis.
plot(x, y, type = "h",
main = "Garis Vertikal (type = 'h')",
xlab = "x", ylab = "y",
col = "darkred")Tipe o menggabungkan garis dan titik sekaligus. Cocok saat kita ingin menampilkan nilai individual tetapi juga ingin melihat polanya secara kontinu.
plot(x, y, type = "o",
main = "Titik dan Garis (type = 'o')",
xlab = "x", ylab = "y",
col = "purple", pch = 16)Misalnya kita ingin melihat perubahan efisiensi bahan bakar (mpg) berdasarkan indeks mobil:
plot(mtcars$mpg, type = "o",
main = "Efisiensi Bahan Bakar Mobil",
xlab = "Indeks Mobil",
ylab = "Miles per Gallon (mpg)",
col = "forestgreen", pch = 16)Karena mtcars$mpg belum memiliki urutan waktu tertentu, grafik ini hanya memperlihatkan bagaimana mpg berubah berdasarkan urutan baris data. Jika ingin melihat hubungan dengan variabel lain (misalnya wt), maka scatter plot akan lebih tepat.
Pie Chart
Pie chart atau diagram lingkaran digunakan untuk menampilkan proporsi atau persentase dari suatu total. Setiap irisan (slice) mewakili kategori tertentu, dan ukuran irisan sebanding dengan nilai kategorinya. Pie chart cocok digunakan jika:
- Jumlah kategori tidak terlalu banyak (idealnya 4–6),
- Tujuannya adalah menunjukkan bagian dari keseluruhan (part of a whole),
- Data bersifat kategorik dan memiliki frekuensi atau proporsi yang bermakna.
pie(counts.cyl,
main = "Distribusi Mobil berdasarkan Jumlah Silinder",
col = c("#ffd166", "#06d6a0", "#118ab2"))Agar lebih informatif, kita bisa menambahkan label persentase:
# Hitung proporsi
proporsi <- round(counts.cyl / sum(counts.cyl) * 100)
# Buat label dengan persentase
label <- paste0(names(counts.cyl), " cyl: ", proporsi, "%")
# Pie chart dengan label
pie(counts.cyl,
labels = label,
main = "Persentase Mobil per Silinder",
col = c("#ffd166", "#06d6a0", "#118ab2"))Pie chart kurang cocok jika kategori terlalu banyak atau nilai-nilai terlalu mirip. Dalam kasus tersebut, lebih baik gunakan barplot.
Box Plot
Boxplot atau box-and-whisker plot adalah jenis grafik yang digunakan untuk menampilkan ringkasan lima angka dari data numerik, yaitu nilai minimum (min), kuartil 1 (Q1), median (Q2), kuartil 3 (Q3) dan nilai maksimum (max).
Boxplot sangat berguna untuk mendeteksi distribusi, pencilan (outlier), dan perbandingan antar grup.
Kita mulai dengan membuat boxplot untuk variabel mpg (efisiensi bahan bakar)
boxplot(mtcars$mpg,
main = "Boxplot Efisiensi Bahan Bakar",
ylab = "Miles per Gallon (mpg)",
col = "skyblue")Kita bisa membandingkan mpg berdasarkan jumlah silinder (cyl):
boxplot(mpg ~ cyl,
data = mtcars,
main = "Perbandingan mpg Berdasarkan Jumlah Silinder",
xlab = "Jumlah Silinder",
ylab = "Miles per Gallon",
col = "lightgreen")Notasi mpg ~ cyl berarti kita membuat boxplot mpg terhadap setiap kategori dalam cyl.
Agar lebih menarik secara visual:
boxplot(mpg ~ as.factor(cyl),
data = mtcars,
main = "Efisiensi Bahan Bakar Berdasarkan Silinder",
xlab = "Jumlah Silinder",
ylab = "Miles per Gallon",
col = c("#f94144", "#f3722c", "#f9c74f"),
border = "gray30",
cex.axis = 0.9)Layout
Secara umum, ada tiga cara utama mengatur tata letak (layout) grafik dalam base R:
Menggunakan par(mfrow = c(nr, nc))
Menampilkan grafik dalam bentuk grid: nr baris × nc kolom. Urutan pengisian panel: baris dulu, baru kolom.
# 2 baris, 2 kolom
par(mfrow = c(2, 2))
hist(mtcars$mpg, main = "Histogram")
boxplot(mtcars$mpg, main = "Boxplot")
plot(mtcars$hp, mtcars$mpg, main = "Scatterplot")
barplot(table(mtcars$cyl), main = "Barplot")par(mfrow = c(1, 1))Menggunakan par(mfcol = c(nr, nc))
Mirip mfrow, tapi urutan pengisiannya kolom dulu baru baris.
par(mfcol = c(2, 2))
plot(mtcars$wt, mtcars$mpg, main = "A")
plot(mtcars$hp, mtcars$mpg, main = "B")
plot(mtcars$disp, mtcars$mpg, main = "C")
plot(mtcars$qsec, mtcars$mpg, main = "D")par(mfrow = c(1, 1))Menggunakan layout()
Digunakan saat kamu ingin tata letak yang lebih fleksibel dan tidak simetris. Misalnya, kamu ingin 1 grafik besar di atas dan 2 grafik kecil di bawahnya. Visualisasi matrix layout:
|
|
|
|
layout(matrix(c(1, 1, 2, 3), nrow = 2, byrow = TRUE))
# 1 grafik besar (2 kolom)
hist(mtcars$mpg, main = "Histogram (Lebar 2 Kolom)")
# 2 grafik kecil
boxplot(mtcars$mpg, main = "Boxplot")
plot(mtcars$hp, mtcars$mpg, main = "Scatterplot")✏️ Tips Tambahan: Gunakan par(mar = c(...)) untuk mengatur margin tiap plot jika ingin lebih rapat atau lega. Selalu reset par() jika ingin kembali ke layout default par(mfrow = c(1,1)) atau gunakan dev.off() untuk reset jika di luar RStudio.
# Margin default
plot(1:10, main = "Default")
box()
# Margin diperkecil
par(mar = c(2, 2, 2, 1))
plot(1:10, main = "Rapat")
box()
# Margin diperbesar
par(mar = c(8, 6, 6, 4))
plot(1:10, main = "Lega")
box()Setelah menggunakan par() secara eksplisit, sebaiknya reset ke default agar grafik berikutnya tidak terpengaruh:
par(mar = c(5,4,4,2)) # margin defaultggplot2: Visualisasi yang Lebih Elegan dan Terkontrol
Salah satu keunggulan utama dari bahasa R adalah fleksibilitas dan kekuatannya dalam membuat visualisasi data. Setelah kita mengenal grafik dasar di R (base R graphics), kini saatnya menjelajahi ggplot2, salah satu paket visualisasi paling populer dan powerful dalam ekosistem R.
ggplot2 merupakan bagian dari ekosistem tidyverse, dan dikembangkan berdasarkan konsep Grammar of Graphics, yaitu pendekatan sistematis dalam membangun grafik berdasarkan “lapisan-lapisan” (layers). Pendekatan ini memungkinkan kita menyusun elemen grafik satu per satu, dengan kontrol penuh atas isi, estetika, dan gaya visualnya. Dengan ggplot2, kita bisa:
- Membuat grafik estetik dan profesional
- Menambahkan lapisan visualisasi secara fleksibel (points, lines, bar, smooth, dll.)
- Mengontrol tema, warna, dan anotasi dengan sangat detail
- Melakukan eksplorasi dan storytelling data dengan grafik yang komunikatif
Sebelum menggunakan ggplot2, pastikan sudah menginstalnya (jika belum):
install.packages("ggplot2")Lalu, panggil dengan:
library(ggplot2)Warning: package 'ggplot2' was built under R version 4.4.3
Jika kamu ingin menggunakan ggplot2 dalam konteks tidyverse secara lengkap:
install.packages("tidyverse")
library(tidyverse)Grafik ggplot2 dibangun dari 3 komponen utama:
| Komponen | Penjelasan |
|---|---|
data |
Data frame yang ingin divisualisasikan |
aes() |
Aesthetic mappings, yaitu pemetaan atribut visual (x, y, warna, ukuran, dll.) |
geom_*() |
Jenis geometri visual yang ditampilkan, seperti titik, garis, batang, dll. |
Terkadang, komponen utama dari ggplot2 ditambahkan dengan
| Komponen | Penjelasan |
|---|---|
stat_*() |
Lapisan statistik yang menghitung ringkasan atau transformasi sebelum diplot |
Fungsi geom_* digunakan untuk menambahkan bentuk visual (geometri) ke dalam grafik. Ada banyak pilihan geometri, seperti:
Fungsi geom_* |
Deskripsi |
|---|---|
geom_point() |
Titik (scatterplot) |
geom_line() |
Garis (line plot) |
geom_bar() |
Grafik batang |
geom_boxplot() |
Boxplot |
geom_histogram() |
Histogram |
geom_col() |
Grafik batang dengan nilai eksplisit |
Fungsi stat_* digunakan untuk menyisipkan perhitungan statistik sebelum data divisualisasikan. Misalnya:
Fungsi stat_* |
Keterangan |
|---|---|
stat_smooth() |
Tambahkan kurva/trend line |
stat_bin() |
Digunakan untuk histogram |
stat_count() |
Menghitung jumlah kategori unik |
stat_summary() |
Menampilkan ringkasan statistik |
Biasanya geom_* dan stat_* sudah saling terhubung. Misalnya:
geom_bar()secara default menggunakanstat = "count"untuk menghitung jumlah frekuensi kategorigeom_histogram()secara default menggunakanstat = "bin"
Kita dapat menggunakan fungsi apropos() untuk melihat semua fungsi geom_* dan stat_* yang tersedia di R:
# Semua fungsi geom yang tersedia
apropos("^geom_") [1] "geom_abline" "geom_area" "geom_bar"
[4] "geom_bin_2d" "geom_bin2d" "geom_blank"
[7] "geom_boxplot" "geom_col" "geom_contour"
[10] "geom_contour_filled" "geom_count" "geom_crossbar"
[13] "geom_curve" "geom_density" "geom_density_2d"
[16] "geom_density_2d_filled" "geom_density2d" "geom_density2d_filled"
[19] "geom_dotplot" "geom_errorbar" "geom_errorbarh"
[22] "geom_freqpoly" "geom_function" "geom_hex"
[25] "geom_histogram" "geom_hline" "geom_jitter"
[28] "geom_label" "geom_line" "geom_linerange"
[31] "geom_map" "geom_path" "geom_point"
[34] "geom_pointrange" "geom_polygon" "geom_qq"
[37] "geom_qq_line" "geom_quantile" "geom_raster"
[40] "geom_rect" "geom_ribbon" "geom_rug"
[43] "geom_segment" "geom_sf" "geom_sf_label"
[46] "geom_sf_text" "geom_smooth" "geom_spoke"
[49] "geom_step" "geom_text" "geom_tile"
[52] "geom_violin" "geom_vline"
# Semua fungsi stat yang tersedia
apropos("^stat_") [1] "stat_align" "stat_bin" "stat_bin_2d"
[4] "stat_bin_hex" "stat_bin2d" "stat_binhex"
[7] "stat_boxplot" "stat_contour" "stat_contour_filled"
[10] "stat_count" "stat_density" "stat_density_2d"
[13] "stat_density_2d_filled" "stat_density2d" "stat_density2d_filled"
[16] "stat_ecdf" "stat_ellipse" "stat_function"
[19] "stat_identity" "stat_qq" "stat_qq_line"
[22] "stat_quantile" "stat_sf" "stat_sf_coordinates"
[25] "stat_smooth" "stat_spoke" "stat_sum"
[28] "stat_summary" "stat_summary_2d" "stat_summary_bin"
[31] "stat_summary_hex" "stat_summary2d" "stat_unique"
[34] "stat_ydensity"
Histogram
Contoh paling sederhana di bawah ini memvisualisasikan sebaran efisiensi bahan bakar (mpg) dari dataset mtcars.
ggplot(mtcars, aes(x = mpg)) +
geom_histogram()`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Pada contoh ini:
mtcarsadalah data yang digunakan.aes(x = mpg)menunjukkan bahwa variabel mpg akan diplot pada sumbu horizontal.geom_histogram()menampilkan histogram dengan jumlah bin default (biasanya 30).
Visualisasi ini memberikan gambaran umum distribusi tanpa pengaturan tambahan.
Agar lebih informatif dan menarik, histogram dapat dikustomisasi melalui beberapa argumen.
ggplot(mtcars, aes(x = mpg)) +
geom_histogram(
bins = 10,
fill = "steelblue",
color = "white"
) +
labs(
title = "Distribusi Efisiensi Bahan Bakar",
x = "Miles per Gallon (mpg)",
y = "Frekuensi"
) +
theme_minimal()bins = 10menentukan jumlah interval (bin) yang digunakan dalam histogram.fill = "steelblue"mengatur warna isi batang histogram.color = "white"memberi batas putih antar batang, meningkatkan keterbacaan.labs()memberikan judul dan label sumbu yang jelas.theme_minimal()menerapkan tampilan yang bersih dan sederhana.
Alih-alih menentukan jumlah bin, kita juga bisa mengatur lebar setiap bin secara langsung:
ggplot(mtcars, aes(x = mpg)) +
geom_histogram(
binwidth = 2,
fill = "#00bfc4",
color = "black"
) +
labs(
title = "Histogram dengan Binwidth = 2",
x = "Miles per Gallon (mpg)",
y = "Jumlah Kendaraan"
) +
theme_classic()binwidth = 2berarti setiap batang mewakili rentang 2 satuanmpg.theme_classic()digunakan untuk gaya visual yang lebih formal.
Scatter Plot
Kita mulai dengan membuat scatterplot antara hp (horsepower/daya mesin) dan mpg (miles per gallon/efisiensi bahan bakar).
ggplot(mtcars, aes(x = hp, y = mpg)) +
geom_point()aes(x = hp, y = mpg)menyatakan bahwa hp diplot di sumbu-x dan mpg di sumbu-y.geom_point()digunakan untuk membuat titik-titik scatterplot.
Berikut versi yang lebih informatif dengan kustomisasi warna, ukuran titik, dan label:
ggplot(mtcars, aes(x = hp, y = mpg)) +
geom_point(
color = "tomato",
size = 2
) +
labs(
title = "Hubungan Horsepower vs Efisiensi Bahan Bakar",
x = "Horsepower (hp)",
y = "Miles per Gallon (mpg)"
) +
theme_minimal()color = "tomato"mengatur warna titik.size = 3memperbesar ukuran titik agar lebih terlihat jelas.labs()memberikan judul dan label sumbu.theme_minimal()membuat tampilan bersih dan fokus pada data.
Bar Plot
Pertama, kita buat barplot sederhana untuk melihat jumlah mobil berdasarkan jumlah silinder (cyl).
ggplot(mtcars, aes(x = factor(cyl))) +
geom_bar()aes(x = factor(cyl))berarticyldikonversi ke faktor agar dianggap sebagai kategori.geom_bar()menghitung jumlah observasi dalam tiap kategori dan membuat batangnya.
Kita kustomisasi tampilan barplot agar lebih informatif dan estetis:
ggplot(mtcars, aes(x = factor(cyl))) +
geom_bar(
fill = "#1f78b4",
color = "black",
width = 0.7
) +
labs(
title = "Jumlah Mobil Berdasarkan Silinder",
x = "Jumlah Silinder",
y = "Jumlah Mobil"
) +
theme_minimal()fillmengatur warna isi batang.colormemberi batas luar (outline) pada setiap batang.widthmengatur lebar batang (default = 0.9).labs()digunakan untuk menambahkan judul dan label sumbu.
Pie Chart
Untuk membuat pie chart yang informatif dan estetik di ggplot2, biasanya kita perlu sedikit manipulasi data. Di sini kita perkenalkan penggunaan paket dplyr untuk menyiapkan data sebelum divisualisasikan.
Baik ggplot2 maupun dplyr merupakan bagian dari ekosistem tidyverse, sehingga ketika kita akan menggunakan keduanya (atau paket lain seperti readr, tibble, tidyr, dll.), cukup memuat tidyverse saja.
# Memuat semua paket dalam tidyverse
library(tidyverse)Warning: package 'dplyr' was built under R version 4.4.3
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ lubridate 1.9.3 ✔ tibble 3.2.1
✔ purrr 1.0.2 ✔ tidyr 1.3.1
── 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
Kita mulai dengan membuat data sederhana berisi lima kategori:
# Buat data
data <- data.frame(
group = LETTERS[1:5],
value = c(13, 7, 9, 21, 2)
)Lalu, kita olah data tersebut agar bisa ditampilkan dalam bentuk pie chart:
data <- data %>%
arrange(desc(group)) %>% # Urutkan kategori (opsional)
mutate(prop = value / sum(value) * 100) %>% # Hitung proporsi (persentase)
mutate(ypos = cumsum(prop) - 0.5 * prop) # Hitung posisi labelarrange(desc(group))membantu menjaga urutan kategori saat divisualisasikan.propmenyatakan persentase dari tiap kategori.yposmenentukan posisi label agar muncul di tengah sektor masing-masing.
ggplot(data, aes(x = "", y = prop, fill = group)) +
geom_bar(stat = "identity", width = 1, color = "white") + # Batang sebagai dasar pie chart
coord_polar("y", start = 0) + # Ubah ke koordinat polar (pie)
theme_void() + # Hapus sumbu dan grid
theme(legend.position = "none") + # Sembunyikan legend
geom_text(aes(y = ypos, label = group), color = "white", size = 6) + # Label kategori
scale_fill_brewer(palette = "Pastel1") # Palet warna yang estetikPie chart seperti ini sering digunakan untuk menampilkan komposisi kategori dalam bentuk visual yang mudah dicerna. Kita bisa mengganti label kategori dengan nilai absolut atau persentase (paste0(group, ": ", round(prop, 1), "%")) sesuai konteks visualisasi.
Line Plot
Sebelum membuat line plot, kita perlu mengenal dataset yang akan digunakan. R menyediakan data bawaan bernama economics yang berasal dari paket ggplot2. Dataset ini berisi data ekonomi bulanan Amerika Serikat dari tahun 1967 hingga 2015. Informasi yang tersedia mencakup:
date: tanggal observasi (dalam format waktu)psavert: personal saving rate (tingkat tabungan pribadi)pce: personal consumption expenditures (pengeluaran konsumsi pribadi)unemploy: jumlah pengangguran (dalam ribuan orang)uempmed: durasi rata-rata pengangguran (dalam minggu)pop: total populasi (dalam ribuan)
Dataset ini sangat cocok digunakan untuk visualisasi deret waktu karena memuat informasi yang bervariasi sepanjang waktu.
data("economics")
head(economics)Contoh berikut menampilkan tren jumlah pengangguran (unemploy) sepanjang waktu menggunakan ggplot2.
ggplot(economics, aes(x = date, y = unemploy)) +
geom_line(color = "steelblue") +
labs(
title = "Jumlah Pengangguran di AS (1967–2015)",
x = "Tahun",
y = "Jumlah Pengangguran (ribu orang)"
) +
theme_minimal()aes(x = date, y = unemploy)menentukan sumbu-x dan sumbu-y dari grafik.geom_line()membuat grafik garis (line plot).labs()memberikan judul grafik dan label pada sumbu.theme_minimal()memberikan tampilan grafik yang bersih dan modern.
Kita juga dapat menambahkan elemen estetika dan garis tren untuk memperjelas pola data.
ggplot(economics, aes(x = date, y = unemploy)) +
geom_line(color = "tomato", linewidth = 1.2) +
geom_smooth(se = FALSE, color = "gray40", linetype = "dashed") +
labs(
title = "Tren Jumlah Pengangguran di AS",
subtitle = "Data bulanan dari tahun 1967 sampai 2015",
x = "Tahun",
y = "Jumlah Pengangguran"
) +
theme_light()`geom_smooth()` using method = 'loess' and formula = 'y ~ x'
geom_smooth(se = FALSE)menambahkan garis tren tanpa pita kepercayaan.linewidthdanlinetypemengatur tebal dan gaya garis.theme_light()memberikan tampilan cerah yang tetap rapi.
Color Pallette
Untuk menjelajahi berbagai palet warna yang tersedia di RColorBrewer, kamu bisa mengunjungi colorbrewer2.org. Palet dapat dipilih berdasarkan jenis data, pertimbangan buta warna, dan media tampilan, dimana kita dapat melihat berbagai skema warna — baik sequential, diverging, maupun qualitative — serta filter untuk pilihan yang ramah buta warna atau visual cetak.
Selain itu, kamu juga dapat mengeksplorasi langsung di R dengan:
library(RColorBrewer)
display.brewer.all()atau menampilkan palet spesifik:
display.brewer.pal(n = 8, name = "Accent")Sankey Diagram Interaktif dengan networkD3
Sankey diagram adalah jenis visualisasi alur (flow) yang sangat berguna untuk menggambarkan perpindahan nilai antara beberapa entitas atau kelompok. Setiap panah dalam diagram ini mewakili suatu aliran, dan lebar panah mencerminkan besar nilai dari aliran tersebut. Dalam praktiknya, Sankey diagram sering digunakan dalam konteks energi, keuangan, rantai pasok, atau visualisasi sistem yang memiliki input-output kompleks.
Untuk membuat Sankey diagram interaktif di R, kita akan menggunakan paket networkD3. Jika belum terpasang, silakan instal terlebih dahulu dengan install.packages("networkD3").
library(networkD3)Warning: package 'networkD3' was built under R version 4.4.3
Langkah pertama adalah menyiapkan data berupa daftar hubungan antar grup (koneksi), yang kita simpan ke dalam data frame links. Setiap baris menunjukkan satu aliran dari source ke target dengan nilai tertentu. Nilai ini akan menentukan lebar dari panah di diagram.
links <- data.frame(
source = c("group_A", "group_A", "group_B", "group_C", "group_C", "group_E"),
target = c("group_C", "group_D", "group_E", "group_F", "group_G", "group_H"),
value = c(2, 3, 2, 3, 1, 3)
)Berikutnya, kita buat data nodes, yaitu daftar semua entitas unik yang terlibat dalam aliran (baik sebagai sumber maupun tujuan). Ini diperlukan karena networkD3 hanya menerima ID numerik, bukan nama langsung.
nodes <- data.frame(
name = c(as.character(links$source), as.character(links$target)) %>% unique()
)Agar diagram dapat digambar dengan benar, kita perlu mengonversi nama source dan target pada links menjadi ID numerik berdasarkan urutan di nodes. Karena networkD3 menggunakan indexing mulai dari 0 (bukan 1 seperti R pada umumnya), maka kita perlu mengurangi hasil match() dengan 1.
links$IDsource <- match(links$source, nodes$name) - 1
links$IDtarget <- match(links$target, nodes$name) - 1Setelah semua persiapan data selesai, kita dapat langsung membangun diagram menggunakan fungsi sankeyNetwork(). Kita berikan parameter Links, Nodes, serta nama kolom untuk Source, Target, Value, dan NodeID. Argumen sinksRight = FALSE digunakan agar node akhir tidak otomatis berada di sisi paling kanan, melainkan lebih fleksibel sesuai arah aliran.
p <- sankeyNetwork(
Links = links, Nodes = nodes,
Source = "IDsource", Target = "IDtarget",
Value = "value", NodeID = "name",
sinksRight = FALSE
)
p