TL;DR
ggplot2 adalah paket R buat bikin grafik dengan cara nyusun lapisan: data, aesthetic mapping (kolom mana jadi sumbu apa), lalu geom (bentuk grafiknya). Pola dasarnya selalu ggplot(data, aes(x, y)) + geom_sesuatu(). Sekali paham pola ini, kamu bisa bikin bar chart, line chart, sampai scatter plot pakai struktur kode yang sama.
ggplot2 nyusun grafik dari lapisan yang ditumpuk pakai tanda plus. Data dulu, terus kolom mana jadi sumbu apa, terakhir bentuk grafiknya.
Begitu paham urutan itu, kamu nggak perlu ngapalin puluhan fungsi. Bar chart dan scatter plot ditulis dengan struktur yang persis sama, cuma beda satu baris.
Di tutorial ini kita pakai data penjualan toko_berkah, toko sembako 3 cabang di Bekasi. Semua kode bisa kamu jalanin langsung di RStudio atau Posit Cloud.
ggplot2 adalah paket R buat bikin grafik statistik. Namanya diambil dari grammar of graphics, ide bahwa semua grafik bisa dipecah jadi komponen yang sama: data, pemetaan kolom ke elemen visual, dan bentuk geometri yang dipakai buat gambarnya.
Karena komponennya seragam, kamu ganti satu komponen dan grafiknya berubah total. Ganti geom_col() jadi geom_line(), bar chart langsung jadi line chart tanpa nulis ulang apa-apa.
Tiga komponen yang wajib ada:
Install sekali aja, lalu panggil tiap sesi.
install.packages("tidyverse")
library(tidyverse)
tidyverse udah termasuk ggplot2 plus dplyr buat ngolah data. Kalau mau ringan, install.packages("ggplot2") juga cukup.
Sekarang bikin data penjualannya. Ini angka dari 3 cabang toko_berkah selama 6 bulan pertama 2025, dalam rupiah.
penjualan <- tibble(
bulan = rep(c("Jan","Feb","Mar","Apr","Mei","Jun"), times = 3),
cabang = rep(c("Bekasi Kota","Pondok Gede","Jatiasih"), each = 6),
omzet = c(
182500000, 176300000, 195100000, 188900000, 241700000, 203400000,
134200000, 129800000, 141500000, 138600000, 176900000, 149300000,
98700000, 94100000, 103600000, 101200000, 128400000, 110500000
),
transaksi = c(
4210, 4085, 4470, 4318, 5402, 4661,
3180, 3062, 3341, 3255, 4108, 3510,
2405, 2298, 2512, 2461, 3070, 2688
)
)
Kolom bulan masih teks, jadi urutannya bakal alfabetis pas digambar. Kita perbaiki dengan bikin factor berurutan.
penjualan <- penjualan |>
mutate(bulan = factor(bulan, levels = c("Jan","Feb","Mar","Apr","Mei","Jun")))
Polanya selalu begini:
ggplot(data = nama_data, mapping = aes(x = kolom1, y = kolom2)) +
geom_bentuk()
Baris pertama nyiapin kanvas dan bilang kolom mana jadi sumbu apa. Baris kedua yang beneran menggambar. Tanpa geom, kamu cuma dapat kanvas kosong berisi sumbu.
Tanda plus di ujung baris itu wajib. Kalau plusnya ditaruh di awal baris berikutnya, R bakal ngira perintahnya udah selesai dan grafiknya kepotong.
Pertama, jumlahkan omzet 6 bulan per cabang.
ringkas <- penjualan |>
group_by(cabang) |>
summarise(total_omzet = sum(omzet))
ggplot(ringkas, aes(x = reorder(cabang, -total_omzet), y = total_omzet)) +
geom_col(fill = "#0891b2") +
labs(
title = "Omzet 6 Bulan per Cabang toko_berkah",
x = NULL,
y = "Omzet (Rp)"
)
Hasilnya 3 batang. Bekasi Kota Rp 1.187.900.000, Pondok Gede Rp 870.300.000, Jatiasih Rp 636.500.000.
reorder() yang bikin batangnya urut dari besar ke kecil. Tanpa itu, R nyusun berdasarkan abjad dan pembaca harus mikir dua kali.
Angka rupiah di sumbu y masih ditulis notasi ilmiah kayak 1.2e+09. Rapikan pakai scales.
library(scales)
ggplot(ringkas, aes(x = reorder(cabang, -total_omzet), y = total_omzet)) +
geom_col(fill = "#0891b2") +
scale_y_continuous(labels = label_number(scale = 1e-6, suffix = " jt")) +
labs(title = "Omzet 6 Bulan per Cabang", x = NULL, y = "Omzet (juta Rp)")
Ganti geom-nya, tambahin warna per cabang. Struktur kodenya sama persis.
ggplot(penjualan, aes(x = bulan, y = omzet, colour = cabang, group = cabang)) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
scale_y_continuous(labels = label_number(scale = 1e-6, suffix = " jt")) +
labs(title = "Tren Omzet Bulanan 2025", x = NULL, y = "Omzet (juta Rp)", colour = "Cabang")
group = cabang penting waktu sumbu x-nya kategori. Tanpa itu, ggplot2 nggak tau titik mana yang harus disambung dan garisnya nggak muncul.
Perhatikan lonjakan di Mei. Ketiga cabang naik barengan, rata-rata 27,4 persen dibanding April. Itu efek Ramadan dan Lebaran, pola yang muncul tiap tahun di data ritel sembako.
Kalau kamu mau tau apakah jumlah transaksi berbanding lurus sama omzet, pakai titik.
ggplot(penjualan, aes(x = transaksi, y = omzet, colour = cabang)) +
geom_point(size = 3, alpha = 0.8) +
geom_smooth(method = "lm", se = FALSE, colour = "grey40", linewidth = 0.6) +
scale_y_continuous(labels = label_number(scale = 1e-6, suffix = " jt")) +
labs(title = "Transaksi vs Omzet", x = "Jumlah transaksi", y = "Omzet (juta Rp)")
geom_smooth(method = "lm") nambahin garis regression lurus. Kalau titik-titiknya nempel di garis, hubungannya kuat.
Dari data toko_berkah, rata-rata nilai per transaksi Rp 43.100. Cabang Bekasi Kota sedikit di atas, Rp 43.700 per struk. Selisih Rp 600 kelihatan kecil, tapi dikali 27.000 transaksi jadi Rp 16,2 juta.
Kadang 3 garis di satu grafik masih berdempetan. Pecah jadi panel terpisah pakai facet_wrap().
ggplot(penjualan, aes(x = bulan, y = omzet, group = cabang)) +
geom_col(fill = "#f97316") +
facet_wrap(~ cabang, ncol = 3) +
scale_y_continuous(labels = label_number(scale = 1e-6)) +
labs(title = "Omzet Bulanan per Cabang", x = NULL, y = "Juta Rp")
Satu baris tambahan, tiga panel jadi. Ini yang bikin ggplot2 hemat waktu dibanding gambar grafik satu-satu di Excel.
Kalau skala tiap panel beda jauh, tambahin scales = "free_y" supaya panel kecil tetap kebaca.
Tampilan default ggplot2 punya latar abu-abu. Buat slide kantor, biasanya lebih enak yang bersih.
ggplot(ringkas, aes(x = reorder(cabang, -total_omzet), y = total_omzet)) +
geom_col(fill = "#0891b2", width = 0.6) +
scale_y_continuous(labels = label_number(scale = 1e-6, suffix = " jt")) +
labs(title = "Omzet 6 Bulan per Cabang", subtitle = "toko_berkah, Jan sampai Jun 2025", x = NULL, y = NULL) +
theme_minimal(base_size = 13) +
theme(panel.grid.major.x = element_blank())
Simpan hasilnya ke file:
ggsave("omzet-cabang.png", width = 8, height = 4.5, dpi = 300)
Ukuran 8 x 4,5 inci pas buat slide 16:9. dpi 300 aman buat dicetak.
aes(fill = "biru") bikin ggplot2 nganggap "biru" itu kategori data. Warna tetap ditaruh di luar aes: geom_col(fill = "#0891b2").group =.geom_bar() ngitung jumlah baris sendiri. Kalau kamu udah punya kolom total, pakai geom_col().| Fungsi | Buat apa | Kapan dipakai |
|---|---|---|
geom_col() | Batang dari nilai yang udah ada | Bandingin total antar kategori |
geom_bar() | Batang dari hitungan baris | Hitung frekuensi kategori |
geom_line() | Garis | Tren waktu |
geom_point() | Titik | Hubungan dua angka |
geom_boxplot() | Kotak sebaran | Lihat sebaran dan outlier |
geom_histogram() | Distribusi satu angka | Cek bentuk sebaran data |
Daftar lengkapnya ada di dokumentasi resmi ggplot2.
geom_bar() ngitung sendiri berapa baris per kategori, jadi kamu cuma kasih sumbu x. geom_col() pakai nilai yang udah ada di kolom y kamu. Kalau data kamu udah diringkas pakai summarise(), pakai geom_col(). Salah pilih bikin grafik kamu nampilin angka 1 di semua batang.
Perlu dasarnya aja: cara bikin data frame, cara panggil fungsi, dan cara pakai pipe. Nggak perlu paham loop atau function sendiri. Banyak analis mulai dari ggplot2 justru karena hasilnya kelihatan cepat, terus lanjut belajar dplyr buat ngolah datanya.
Tiga penyebab paling sering: paketnya belum dipanggil pakai library(ggplot2), kodenya cuma ggplot() tanpa geom, atau tanda plus ditaruh di awal baris. Kalau kamu jalanin dari script biasa (bukan RStudio), grafiknya perlu dibungkus print() supaya kelihatan.
Bisa. Pakai readxl::read_excel("file.xlsx") buat baca filenya, hasilnya langsung jadi data frame yang siap dipakai ggplot2. Pastikan baris pertama di Excel isinya nama kolom, bukan judul laporan. Nama kolom yang ada spasinya bakal diubah otomatis jadi bentuk yang aman.
Buat satu grafik sekali pakai, spreadsheet lebih cepat. Buat 12 grafik yang harus diulang tiap bulan dengan data baru, ggplot2 menang telak karena kodenya tinggal dijalankan ulang. Patokan aku: kalau grafiknya bakal dibikin lagi bulan depan, tulis kodenya.
Semua grafik ggplot2 pakai pola yang sama: data, aes, geom. Ganti geom-nya, ganti bentuk grafiknya.
Mulai dari 3 grafik di artikel ini (bar, line, scatter) dan kamu udah nutup 80 persen kebutuhan laporan bulanan.
Kalau kamu mau lanjut bikin laporannya otomatis tiap bulan tanpa copy paste grafik, baca panduan R Markdown. Buat yang masih nyaman di spreadsheet, pelajari dulu SUMIFS dan AVERAGE buat nyiapin ringkasan datanya.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Kolom datetime nyimpen tanggal, jam, hari, semuanya nempel jadi satu. Accessor .dt di pandas ngeluarin tiap bagian jadi kolom sendiri buat dianalisa.
Nama toko ketik campur huruf besar-kecil, spasi nyasar di ujung, atau kode produk nempel jadi satu. Accessor .str di pandas ngerapiin semua itu tanpa loop.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.