ggplot2 Dasar: Grammar of Graphics dengan Data Penjualan Lokal
Blog/Tips & Trik/ggplot2 Dasar: Grammar of Graphics dengan Data Penjualan Lokal

ggplot2 Dasar: Grammar of Graphics dengan Data Penjualan Lokal

BimaBima
·14 November 2025·11 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

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, pakai geom_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

FungsiBuat apaKapan dipakai
geom_col()Batang dari nilai yang udah adaBandingin total antar kategori
geom_bar()Batang dari hitungan barisHitung frekuensi kategori
geom_line()GarisTren waktu
geom_point()TitikHubungan dua angka
geom_boxplot()Kotak sebaranLihat sebaran dan outlier
geom_histogram()Distribusi satu angkaCek 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.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel terkait

Pandas groupby: Agregasi Data ala Pivot di Python (2026)
Tips & Trik
20 Juli 2026•9 menit baca

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.

BimaBima
Pandas to_excel: Ekspor DataFrame ke Excel (2026)
Tips & Trik
18 Juli 2026•8 menit baca

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.

BimaBima
Pandas read_excel: Baca File Excel di Python
Tips & Trik
16 Juli 2026•8 menit baca

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.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

© 2026 Ngulik Data. Semua hak dilindungi.

TAUTAN
BantuanHargaDatasetBlogAfiliasi
LEGAL
Syarat & KetentuanKebijakan Privasi
Ngulik Data
DatasetLeaderboardBlogStore