ggplot2 Dasar: Grammar of Graphics dengan Data Penjualan Lokal
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.
Apa itu ggplot2 dan grammar of graphics?
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:
- data: data frame yang mau digambar.
- aes: mapping kolom ke sumbu x, sumbu y, warna, ukuran.
- geom: bentuk visualnya, batang, garis, titik, kotak.
Gimana cara install dan siapin data?
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")))
Gimana struktur kode ggplot2 yang paling dasar?
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.
Bikin bar chart omzet per cabang
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)")
Bikin line chart tren bulanan
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.
Bikin scatter plot buat lihat hubungan dua angka
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.
Facet: pecah satu grafik jadi banyak panel
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.
Rapikan tampilan pakai theme
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.
Kesalahan umum waktu belajar ggplot2
- Naruh plus di awal baris. R baca baris pertama sebagai perintah lengkap. Plus harus di akhir baris sebelumnya.
- Nulis warna tetap di dalam aes.
aes(fill = "biru")bikin ggplot2 nganggap "biru" itu kategori data. Warna tetap ditaruh di luar aes:geom_col(fill = "#0891b2"). - Lupa group di line chart kategori. Garis nggak muncul, cuma titik. Tambahin
group =. - Pakai geom_bar padahal datanya udah diagregasi.
geom_bar()ngitung jumlah baris sendiri. Kalau kamu udah punya kolom total, pakaigeom_col(). - Bulan urut alfabetis. Ubah dulu jadi factor dengan levels berurutan sebelum digambar.
- Sumbu y nggak mulai dari nol di bar chart. Ini bikin selisih kelihatan lebih dramatis dari aslinya. Buat batang, selalu mulai dari nol.
Cheat sheet geom yang paling sering dipakai
| 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.
FAQ
Apa bedanya geom_bar dan geom_col di 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 belajar R dulu sebelum belajar ggplot2?
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.
Kenapa grafik ggplot2 nggak muncul waktu kode dijalanin?
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 nggak bikin grafik ggplot2 dari data Excel?
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.
Lebih baik ggplot2 atau bikin chart di spreadsheet?
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.
Ringkasnya
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.
Artikel terkait
Pandas groupby: Agregasi Data ala Pivot di Python (2026)
groupby ngelompokin baris berdasarkan kolom, lalu ngitung ringkasan per grup kayak total atau rata-rata. Ini pivot-nya pandas.
Pandas to_excel: Ekspor DataFrame ke Excel (2026)
to_excel nyimpen DataFrame pandas jadi file Excel .xlsx. Ini cara pakainya, dari satu sheet sampai banyak sheet, plus setelan yang bikin hasilnya rapi.
Pandas read_excel: Baca File Excel di Python
pandas read_excel baca file Excel jadi DataFrame, bisa pilih sheet tertentu dan lompatin baris judul yang berantakan. Ini cara pakai plus parameter penting dengan contoh data toko.