Visualisasi Data dengan ggplot

Tidyverse

Tidyverse adalah kumpulan package R yang berfungsi untuk melakukan pengolahan data seperti import, subset, visualisasi, transformasi, dan lain sebagainya. Tidyverse diciptakan oleh Hadley Wickham dan timnya dengan tujuan menyediakan semua tools untuk membersihkan, merapikan dan bekerja dengan data. Terdapat ggplot2 untuk data visualisation atau visualisasi data, yang memungkinkan pengguna membuat grafik yang kompleks dengan sintaks yang elegan.

Sebelum melakukan pemrograman simpan R Script dalam suatu folder bersama folder data yang telah diekstrak!

Install packages dan menjalankan library

#Install tidyverse Package
#install.packages("tidyverse")
#atau library(ggplot2)
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.3
## Warning: package 'readr' was built under R version 4.4.3
## Warning: package 'lubridate' 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
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── 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

Tema

Fungsi ggplot() dalam R digunakan untuk memulai pembuatan grafik dengan pendekatan grammar of graphics, di mana pengguna dapat menambahkan elemen visual secara bertahap. Saat digunakan bersama tema, tampilannya bisa disesuaikan. Misalnya, ggplot() + theme_bw() menghasilkan grafik dengan latar putih dan garis kisi hitam yang bersih, cocok untuk presentasi akademik. Tema ggplot() + theme_classic() memberikan tampilan minimalis dengan sumbu tanpa kisi, menyerupai grafik klasik. Sementara itu, ggplot() + theme_dark() menyajikan grafik dengan latar gelap yang ideal untuk tampilan modern atau kebutuhan visual kontras tinggi.

ggplot()

ggplot()+theme_bw()

ggplot()+theme_classic()

ggplot()+theme_dark()

Title

Kode berikut membuat grafik scatter plot menggunakan paket ggplot2 dalam R. Data dibentuk dari vektor x = 1:10 dan y = x^2, kemudian digabungkan menjadi sebuah data frame bernama z. Objek grafik p dibuat dengan ggplot(z, aes(x, y)), lalu ditambahkan lapisan geom_point() untuk menampilkan titik-titik biru dengan bentuk simbol tertentu (shape = 10). Judul grafik disetel dengan ggtitle(), dan label sumbu x dan y diatur masing-masing melalui xlab() dan ylab(). Tampilan grafik menggunakan tema bersih dari theme_classic(), sedangkan posisi judul di tengah disesuaikan menggunakan theme(plot.title = element_text(hjust = 0.5)). Grafik ditampilkan dengan memanggil objek p.

x=1:10;y=x^2;z=data.frame(x,y)
p<-ggplot(z,aes(x,y)) + 
  geom_point(color = 'blue', shape = 10) + 
  ggtitle('Kepadatan Penduduk Terhadap Penjualan Sepatu') +
  xlab('Jumlah Penduduk') +
  ylab('Penjualan') +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5))
p

Data mtcars

Dataset mtcars adalah kumpulan data bawaan dalam R yang berisi informasi teknis tentang 32 mobil berbeda yang diuji oleh majalah Motor Trend pada tahun 1974. Setiap baris mewakili satu mobil, sementara setiap kolom menunjukkan karakteristik tertentu seperti efisiensi bahan bakar (mpg), jumlah silinder (cyl), tenaga kuda (hp), berat mobil (wt), waktu akselerasi (qsec), dan jenis transmisi (am). Dataset ini sering digunakan dalam pembelajaran statistik dan pemrograman R untuk demonstrasi analisis regresi, visualisasi data, dan eksplorasi data karena strukturnya yang sederhana namun kaya akan variabel numerik yang relevan untuk analisis performa kendaraan.

head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

Scatter Plot

  • Visualisasi menggunakan ggplot2 menunjukkan hubungan antara berat mobil (wt) dan efisiensi bahan bakar (mpg) dari dataset mtcars.
  • Grafik pertama menggunakan scatter plot dasar dengan fungsi geom_point().
  • Warna titik dapat diubah menjadi merah menggunakan argumen color=“red”.
  • Ukuran titik dapat diperbesar dengan menggunakan size=3.
  • Dimensi titik dapat dikaitkan dengan jumlah silinder (cyl) menggunakan estetika size=cyl.
  • Warna titik juga dapat mencerminkan nilai dari cyl, sambil menjaga ukuran tetap, misalnya size=4.
  • Kombinasi antara color=cyl dan size=hp memperlihatkan dua variabel sekaligus melalui warna dan ukuran titik.
  • Penggunaan factor(cyl) mengubah variabel silinder menjadi kategorik sehingga tiap kategori memiliki warna berbeda.
  • Transparansi grafik dapat ditambahkan dengan alpha=0.5, dan ukuran titik diperbesar misalnya menjadi size=10.
  • Palet warna dapat dikustomisasi menggunakan scale_color_brewer(palette=“Spectral”) untuk warna-warna yang menarik.
  • Alternatif lain adalah menggunakan scale_color_manual() untuk menentukan warna secara manual.
  • Bentuk titik dapat diubah, misalnya menggunakan shape=8, dan warna khusus seperti “#006666”. Bentuk titik-titik dapat dilihat di https://www.sthda.com/english/wiki/ggplot2-point-shapes
  • Fungsi scale_shape_manual() digunakan untuk mengatur bentuk titik secara manual, namun hanya dapat digunakan untuk variabel kategorik (faktor).
ggplot(data = mtcars, aes(x = wt, y = mpg)) + geom_point()

ggplot(data = mtcars, aes(x = wt, y = mpg)) + 
  geom_point(color="red")

ggplot(data = mtcars, aes(x = wt, y = mpg)) + 
  geom_point(color="red",size=3)

ggplot(data = mtcars, aes(x = wt, y = mpg, size=cyl)) + 
  geom_point()

ggplot(data = mtcars, aes(x = wt, y = mpg, color=cyl)) + 
  geom_point(size=4)

ggplot(data = mtcars, aes(x = wt, y = mpg, color=cyl,size=hp)) + 
  geom_point()

ggplot(data = mtcars, aes(x = wt, y = mpg, color=factor(cyl),size=hp)) + 
  geom_point()

ggplot(data = mtcars, aes(x = wt, y = mpg,color=factor(cyl))) + 
  geom_point(alpha=0.5,size=10)+
  scale_color_brewer(palette="Spectral")

ggplot(data = mtcars, aes(x = wt, y = mpg,color=factor(cyl))) + 
  geom_point(alpha=0.5,size=10)+
  scale_color_manual(values=c("#006666","#00FF00","#FFFF00"))

ggplot(data = mtcars, aes(x = wt, y = mpg)) +
  geom_point(shape=8,color="#006666",size=5)

ggplot(mtcars, aes(x = wt, y = mpg, shape = factor(cyl))) +
  geom_point(size = 3) +
  scale_shape_manual(values = c(15, 17, 19))

Scatter Plot dengan garis

  • Kode-kode ini menggunakan ggplot2 untuk memvisualisasikan hubungan antara variabel berat mobil (wt) dan efisiensi bahan bakar (mpg) dari dataset mtcars.
  • Titik awal grafik disimpan dalam objek grsp1, yang berisi scatter plot dasar menggunakan fungsi ggplot() dan geom_point().
  • geom_line() digunakan untuk menambahkan garis yang menghubungkan titik-titik dalam urutan data.
  • geom_hline() dan geom_vline() digunakan untuk menambahkan garis horizontal dan vertikal pada grafik, baik berdasarkan nilai tetap maupun nilai rata-rata dari variabel.
  • Model regresi linier sederhana dibentuk dengan fungsi lm(), yang memperkirakan hubungan antara mpg dan wt.
  • Koefisien model (intercept dan slope) diperoleh dengan fungsi coef().
  • Garis regresi ditambahkan ke grafik menggunakan geom_abline(), dengan memanfaatkan slope dan intercept dari hasil regresi.
  • Fungsi annotate() digunakan untuk menambahkan teks ke dalam grafik, seperti penulisan persamaan regresi, guna memperkuat interpretasi visualisasi.
  • Kombinasi elemen-elemen ini membuat grafik menjadi lebih informatif, komunikatif, dan dapat diinterpretasikan secara statistik.
grsp1<-ggplot(data = mtcars, aes(y = mpg,x=wt)) + geom_point()
grsp1+geom_line()

grsp1+geom_hline(yintercept = 24,size=1)

grsp1+geom_hline(yintercept = mean(mtcars$mpg),size=1)

grsp1+geom_vline(xintercept = mean(mtcars$wt),size=1)

grsp1+geom_hline(yintercept = mean(mtcars$mpg),size=1)+geom_vline(xintercept = mean(mtcars$wt),size=1)

z <- lm(mpg ~ wt, data = mtcars)
coef(z)
## (Intercept)          wt 
##   37.285126   -5.344472
grsp1+geom_abline(slope=coef(z)[2],intercept = coef(z)[1])

grsp1+geom_abline(slope=coef(z)[2],intercept = coef(z)[1])+
  annotate("text", x =2.5, y = 27.5,label="mpg=37.285-5.344 wt",color='blue')

Data Series

datas <- read.csv("G:/My Drive/AA Statistika nrfqrmn/1. Pengajaran/Genap 2024 2025/Komputasi Statistika I/Komputasi Statistika I/ggplot2/dataseries.csv", sep=";")
head(datas)
##   Tahun Final.Energy.Consumption  Ekspor   Impor      GDP Jumlah.Penduduk
## 1  1990                449715276 25675.3 52116.5 195597.2       177325690
## 2  1991                467805082 29142.4 60083.8 227450.2       179803796
## 3  1992                494501979 33967.0 63296.1 259884.5       182316534
## 4  1993                519695447 36823.0 28327.8 329775.8       184864386
## 5  1994                540963417 40053.3 31988.6 382219.7       187447845
## 6  1995                569027430 45418.2 40654.1 454514.1       190067407

Line Plot

ggplot(datas, aes(x=Tahun, y=Ekspor)) +
  geom_line()

ggplot(data=datas, aes(x=Tahun, y=Ekspor)) +
  geom_line()+
  geom_point()

Library ggpubr

#install.packages("ggpubr")
library(ggpubr)
show_point_shapes()

show_line_types()

Modifikasi Line Plot

  • Kode-kode berikut membuat grafik deret waktu menggunakan ggplot(), yang menggambarkan perkembangan nilai ekspor dan impor berdasarkan variabel Tahun dari dataset datas.
  • Visualisasi pertama menampilkan garis ekspor dengan gaya garis dotdash dan ketebalan garis 1.2, memberikan efek visual yang tegas namun tetap halus.
  • Titik-titik ekspor ditambahkan menggunakan geom_point() dengan bentuk shape = 21 (lingkaran dengan isian), serta warna isian hijau, yang membantu membedakan nilai-nilai individual dalam seri ekspor.
  • Visualisasi kedua menambahkan garis impor dengan gaya garis dashed (putus-putus) dan warna biru, menciptakan kontras yang jelas terhadap garis ekspor.
  • Titik-titik impor menggunakan bentuk shape = 22 (persegi dengan isian) dan warna isian kuning, sehingga membedakan bentuk dan warna antara titik ekspor dan impor.
  • Kombinasi estetika linetype, shape, fill, dan color dalam grafik ini memberikan representasi visual yang efektif untuk membandingkan dua seri waktu dalam satu tampilan grafik yang informatif.
ggplot(datas, aes(x=Tahun, y=Ekspor)) +
  geom_line(linetype = "dotdash",size=1.2)+
  geom_point(size=2,shape=21,fill='green')

ggplot(datas, aes(x=Tahun, y=Ekspor)) +
  geom_line(linetype = "dotdash",size=1,color="red")+
  geom_point(size=2,shape=21,fill='green')+
  geom_line(aes(x=Tahun,y=Impor), linetype='dashed',size=1,color='blue')+
  geom_point(aes(x=Tahun,y=Impor),shape=22,size=2,fill='yellow')

Lineplot dengan anotasi

  • Transformasi data dilakukan dari format wide ke format long menggunakan fungsi melt() dari paket reshape2.
  • Kolom yang digunakan dalam transformasi hanya mencakup Tahun, Ekspor, dan Impor yang dipilih dari dataset asli.
  • Fungsi melt() mengubah struktur data menjadi tiga kolom:
    • Tahun sebagai identifier tetap,
    • variable yang berisi nama variabel (Ekspor atau Impor),
    • value yang berisi nilai masing-masing variabel.
  • Hasil transformasi disimpan dalam objek df3, yang cocok untuk visualisasi multivariat menggunakan ggplot2, seperti membuat grafik garis dengan warna berbeda untuk Ekspor dan Impor.
  • Selanjutnya, dilakukan penyaringan data untuk tahun 2019 dan disimpan ke dalam objek dataend, yang memuat nilai ekspor dan impor khusus untuk tahun tersebut.
  • Objek df3 berguna untuk menggambar seluruh tren deret waktu, sedangkan dataend dapat digunakan untuk keperluan anotasi, seperti menambahkan label nilai terakhir pada grafik.
  • Proses ini meningkatkan fleksibilitas dalam eksplorasi data dan penyajian visual yang lebih informatif dan komunikatif.
#install.packages("reshape2")
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.4.3
## 
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
## 
##     smiths
df3<-melt(datas[,c('Tahun','Ekspor','Impor')],id='Tahun')
dataend=df3[df3$Tahun==2019,]
df3
##    Tahun variable    value
## 1   1990   Ekspor  25675.3
## 2   1991   Ekspor  29142.4
## 3   1992   Ekspor  33967.0
## 4   1993   Ekspor  36823.0
## 5   1994   Ekspor  40053.3
## 6   1995   Ekspor  45418.2
## 7   1996   Ekspor  49814.7
## 8   1997   Ekspor  53443.6
## 9   1998   Ekspor  48847.6
## 10  1999   Ekspor  48665.5
## 11  2000   Ekspor  62124.0
## 12  2001   Ekspor  56323.1
## 13  2002   Ekspor  57105.8
## 14  2003   Ekspor  61034.5
## 15  2004   Ekspor  71584.6
## 16  2005   Ekspor  85659.9
## 17  2006   Ekspor 100798.6
## 18  2007   Ekspor 114101.0
## 19  2008   Ekspor 137020.4
## 20  2009   Ekspor 116510.0
## 21  2010   Ekspor 157779.0
## 22  2011   Ekspor 203496.6
## 23  2012   Ekspor 190031.8
## 24  2013   Ekspor 182551.9
## 25  2014   Ekspor 176292.7
## 26  2015   Ekspor 150393.3
## 27  2016   Ekspor 144489.7
## 28  2017   Ekspor 168828.2
## 29  2018   Ekspor 180012.7
## 30  2019   Ekspor 167683.0
## 31  1990    Impor  52116.5
## 32  1991    Impor  60083.8
## 33  1992    Impor  63296.1
## 34  1993    Impor  28327.8
## 35  1994    Impor  31988.6
## 36  1995    Impor  40654.1
## 37  1996    Impor  42928.6
## 38  1997    Impor  41679.8
## 39  1998    Impor  27336.9
## 40  1999    Impor  24003.3
## 41  2000    Impor  33514.8
## 42  2001    Impor  30962.1
## 43  2002    Impor  31288.9
## 44  2003    Impor  32550.7
## 45  2004    Impor  46524.5
## 46  2005    Impor  57700.9
## 47  2006    Impor  61065.5
## 48  2007    Impor  74473.4
## 49  2008    Impor 129197.3
## 50  2009    Impor  96829.2
## 51  2010    Impor 135663.3
## 52  2011    Impor 177435.7
## 53  2012    Impor 191691.0
## 54  2013    Impor 186628.7
## 55  2014    Impor 178178.8
## 56  2015    Impor 142694.5
## 57  2016    Impor 135652.8
## 58  2017    Impor 156985.5
## 59  2018    Impor 188711.2
## 60  2019    Impor 170727.4
dataend
##    Tahun variable    value
## 30  2019   Ekspor 167683.0
## 60  2019    Impor 170727.4
ggplot(df3, aes(x = Tahun, y = value,color = variable)) +
  geom_line(size=1) +
  scale_color_manual(values = c("#999999", "#E69F00")) +
  theme_minimal()

#install.packages("ggrepel")
library(ggrepel)
## Warning: package 'ggrepel' was built under R version 4.4.3

geom_text_repel() dari paket ggrepel digunakan untuk memberi label pada titik akhir (tahun 2019) agar tidak saling menumpuk.

lp2 <- ggplot(df3, aes(x = Tahun, y = value, group = variable)) +
  geom_line(aes(color=variable)) +
  geom_point(aes(shape=variable)) 
lp2 + geom_text_repel(aes(label = variable), data = dataend,
    color = "black", size = 3)

Data Economics

Dataset economics dalam R merupakan data bawaan dari paket ggplot2 yang berisi informasi ekonomi bulanan Amerika Serikat sejak Juli 1967 hingga tahun 2015. Data ini terdiri dari beberapa variabel penting seperti pce (Personal Consumption Expenditures), pop (jumlah penduduk), psavert (tingkat tabungan pribadi), uempmed (durasi median pengangguran dalam minggu), dan unemploy (jumlah pengangguran dalam ribuan orang). Setiap observasi dicatat berdasarkan tanggal dalam variabel date dengan interval waktu bulanan

head(economics)
## # A tibble: 6 × 6
##   date         pce    pop psavert uempmed unemploy
##   <date>     <dbl>  <dbl>   <dbl>   <dbl>    <dbl>
## 1 1967-07-01  507. 198712    12.6     4.5     2944
## 2 1967-08-01  510. 198911    12.6     4.7     2945
## 3 1967-09-01  516. 199113    11.9     4.6     2958
## 4 1967-10-01  512. 199311    12.9     4.9     3143
## 5 1967-11-01  517. 199498    12.8     4.7     3066
## 6 1967-12-01  525. 199657    11.8     4.8     3018

melt() digunakan untuk merubah ke format long dengan, sehingga kedua variabel disatukan dalam kolom value, sementara identitas variabel dicatat di kolom variable

ggplot(economics, aes(x=date)) +
  geom_line(aes(y = psavert), color = "darkred") +
  geom_line(aes(y = uempmed), color="steelblue", linetype="twodash") +
  theme_minimal()

df <- melt(economics[, c("date", "psavert", "uempmed")], id="date")
ggplot(df, aes(x = date, y = value,color = variable)) +
  geom_line(size=1) +
  scale_color_manual(values = c("#999999", "#E69F00")) +
  theme_minimal()

Bar Plot

datax <- read.csv("G:/My Drive/AA Statistika nrfqrmn/1. Pengajaran/Genap 2024 2025/Komputasi Statistika I/Komputasi Statistika I/ggplot2/datacontoh3.csv", sep=",")
head(datax)
##    kode jeniskelamin pendidikan jenispekerjaan lamabekerja penghasilan
## 1 94001    LAKI LAKI        SMA Pegawai swasta           5    12432199
## 2 94002    LAKI LAKI        SMA            PNS          15     3645634
## 3 94003    LAKI LAKI        SMA Pegawai swasta           1     3560606
## 4 94004    LAKI LAKI    DIPLOMA Pegawai swasta           6    10254833
## 5 94005    LAKI LAKI    DIPLOMA Pegawai swasta          16     5197534
## 6 94006    LAKI LAKI         S1 Pegawai swasta           2     8000000

Bar Chart Sederhana

  • Kode pertama memvisualisasikan jumlah kategori pendidikan dengan geom_bar(stat = ‘count’), yang menghitung frekuensi tiap kategori secara eksplisit.
  • Kode kedua memvisualisasikan jeniskelamin menggunakan geom_bar() tanpa menyebutkan stat, karena count adalah nilai default.
ggplot(datax, aes(x=pendidikan))+
  geom_bar(stat='count')

ggplot(datax, aes(x=jeniskelamin))+
  geom_bar()

df=data.frame(table(datax$pendidikan))
names(df)= c("pendidikan","frekuensi")
df
##   pendidikan frekuensi
## 1    DIPLOMA     10656
## 2         S1     15726
## 3      S2/S3      1277
## 4         SD       144
## 5        SMA     27582
## 6        SMP       615
  • Kode pertama menggunakan geom_col(), yang secara otomatis menggunakan nilai y dari data sebagai tinggi batang.
  • Kode kedua menggunakan geom_bar(stat = ‘identity’), yang menghasilkan grafik serupa dengan menyatakan bahwa nilai y diambil langsung dari data, bukan dihitung oleh ggplot.
ggplot(df, aes(x=pendidikan, y=frekuensi)) + 
  geom_col()

ggplot(df, aes(x=pendidikan, y=frekuensi)) + 
  geom_bar(stat='identity')

Modifikasi Bar Chart

  • Kode pertama menggunakan geom_bar(stat = “identity”) dengan fill = “white” dan color = “brown”, menciptakan kontras klasik antara isi dan tepi batang.
  • Kode kedua mengatur fill = “#FFCC33” (kuning keemasan) dan width = 0.5, menghasilkan batang yang ramping dan estetis.
  • Kode ketiga memberi warna berbeda untuk setiap kategori dengan vektor warna pada fill, serta menambahkan theme_minimal() untuk tampilan yang bersih dan modern.
ggplot(df, aes(x=pendidikan, y=frekuensi)) +
  geom_bar(stat="identity",fill="white",color='brown')

ggplot(data=df, aes(x=pendidikan, y=frekuensi)) +
  geom_bar(stat="identity",fill="#FFCC33",width=0.5)

ggplot(data=df, aes(x=pendidikan, y=frekuensi)) +
  geom_bar(stat="identity",fill=c('blue','red','green','brown','yellow','green'),width=0.9)+
  theme_minimal()

  • Kode pertama menggunakan warna kuning emas untuk batang (fill = “#FFCC33”), lebar 0.9, tema minimalis, dan membatasi sumbu Y hingga 30.000 untuk efisiensi ruang.
  • Kode kedua menambahkan skala Y dengan breaks tiap 2.000 dan mengganti label kategori X menjadi nama yang lebih informatif menggunakan scale_x_discrete(labels = …).
  • Kode ketiga menghapus seluruh garis kisi (grid) pada sumbu X dan Y melalui theme(), menghasilkan tampilan bersih dan fokus, cocok untuk laporan resmi atau publikasi.
ggplot(data=df, aes(x=pendidikan, y=frekuensi)) +
  geom_bar(stat="identity",fill="#FFCC33",width=0.9)+
  theme_minimal()+
  scale_y_continuous(limits = c(0,30000))

ggplot(data=df, aes(x=pendidikan, y=frekuensi)) +
  geom_bar(stat="identity",fill="#FFCC33",width=0.9)+
  theme_minimal()+
  scale_y_continuous(breaks = seq(0,30000,by=2000),limits = c(0,30000))+
  scale_x_discrete(labels=c("D","Sarjana","Magister/Doctor","SD","SMA","SMP"))

ggplot(data=df, aes(x=pendidikan, y=frekuensi)) +
  geom_bar(stat="identity",fill="#FFCC33",width=0.9)+
  theme_minimal()+
  scale_y_continuous(breaks = c(0,5000,10000,15000,20000,25000,30000),limits = c(0,30000))+
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank(),
    panel.grid.minor.y = element_blank(),
    panel.grid.major.y = element_blank()
  )

Mengurutkan bar berdasarkan frekuensi

ggplot(data=df, aes(x=reorder(pendidikan,frekuensi), y=frekuensi)) +
  geom_bar(stat="identity",fill="#FFCC33",width=0.9)+
  theme_minimal()+
  scale_y_continuous(breaks = c(0,5000,10000,15000,20000,25000,30000),limits = c(0,30000))+
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank(),
    panel.grid.major.y = element_blank()
  )

ggplot(data=df, aes(x=reorder(pendidikan,-frekuensi), y=frekuensi)) +
  geom_bar(stat="identity",fill="#FFCC33",width=0.9)+
  theme_minimal()+
  scale_y_continuous(breaks = c(0,5000,10000,15000,20000,25000,30000),limits = c(0,30000))+
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank(),
    panel.grid.minor.y = element_blank()
  )

Menambahkan Title

p=ggplot(data=df, aes(x=reorder(pendidikan,frekuensi), y=frekuensi)) +
  geom_bar(stat="identity",fill="#FFCC33",width=0.9)+
  theme_minimal()+
  scale_y_continuous(breaks = c(0,5000,10000,15000,20000,25000,30000),limits = c(0,30000))+
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank(),
    panel.grid.minor.y = element_blank(),
  )
p=p+labs(title = "Pendidikan Pelanggan", x = "Pendidikan", y = "Jumlah", size=20)
p=p+theme(
  plot.title = element_text(hjust=0.5,size=15),
  axis.text.x= element_text(size=9),
  axis.title.x = element_text(size=12),
  axis.title.y = element_text(size=12)
)
p

Menambahkan angka dan merotasi bar chart

#Menampilkan angka pada barnya##
p+geom_text(aes(label=frekuensi), vjust=-0.5, color="black", size=3.5)

##Merotasi bar chart##
p+coord_flip()+
  geom_text(aes(label=frekuensi), hjust=-0.5, color="black", size=3.5)

Multi Bar Chart

databar=data.frame(table(datax$pendidikan,datax$jeniskelamin))
names(databar)<- c("pendidikan","jeniskelamin","frekuensi")
databar
##    pendidikan jeniskelamin frekuensi
## 1     DIPLOMA    LAKI LAKI      7822
## 2          S1    LAKI LAKI     11582
## 3       S2/S3    LAKI LAKI       899
## 4          SD    LAKI LAKI       128
## 5         SMA    LAKI LAKI     23856
## 6         SMP    LAKI LAKI       488
## 7     DIPLOMA    PEREMPUAN      2834
## 8          S1    PEREMPUAN      4144
## 9       S2/S3    PEREMPUAN       378
## 10         SD    PEREMPUAN        16
## 11        SMA    PEREMPUAN      3726
## 12        SMP    PEREMPUAN       127

Multi Bar Chart Sederhana

  • jeniskelamin dipetakan ke sumbu X, frekuensi ke sumbu Y, dan pendidikan ke warna batang melalui fill = pendidikan.
ggplot(databar, aes(x=jeniskelamin, y=frekuensi,fill=pendidikan)) +
  geom_bar(stat="identity", width=0.9)+
  labs(title="Pendidikan dan Gender",x="p&G",y="jumlah")+
  theme_minimal() 

  • Kode pertama menggunakan scale_fill_manual(values = c(“blue”, “coral”)) untuk menetapkan warna secara manual, memberi kontrol penuh pada pengguna.

  • Kode kedua menyimpan grafik dasar ke variabel mp dan menampilkan dua variasi:

    ggplot(data=databar, aes(x=pendidikan, y=frekuensi,fill=jeniskelamin)) +
      geom_bar(stat="identity", width=0.9)+
      theme_minimal()+scale_fill_manual(values=c("blue", "coral"))

    mp=ggplot(data=databar, aes(x=pendidikan, y=frekuensi,fill=jeniskelamin)) +
      geom_bar(stat="identity", width=0.9)+
      theme_minimal()

    mp+ scale_fill_brewer(palette="Dark2")

    mp+ scale_fill_manual(values=c("yellow", "blue"))

Dodge

Dodge merujuk pada teknik penempatan elemen grafik secara berdampingan (samping-sampingan) alih-alih ditumpuk, terutama untuk grafik batang (bar chart) atau kolom (column chart). Tujuan utamanya adalah membandingkan nilai antar kelompok secara lebih jelas.

ggplot(databar, aes(x=pendidikan, y=frekuensi,fill=jeniskelamin)) +
  geom_bar(stat="identity",position='dodge')+
  theme_minimal() 

Pie Chart

Pie Chart Sederhana

Kode berikut digunakan untuk menganalisis distribusi frekuensi dari variabel jeniskelamin dalam dataset datax. Proses dimulai dengan menghitung jumlah kemunculan setiap kategori pada variabel tersebut menggunakan fungsi table(), lalu hasilnya diubah menjadi data frame agar lebih mudah diolah. Nama kolom data frame kemudian diganti menjadi “jeniskelamin” dan “frekuensi” untuk memberikan penamaan yang lebih deskriptif. Selanjutnya, ditambahkan kolom label yang menunjukkan persentase tiap kategori, dihitung dengan membagi frekuensi masing-masing kategori terhadap total keseluruhan, dikalikan 100, dibulatkan hingga dua desimal, dan ditambahkan simbol persen untuk keperluan tampilan. Kemudian ditambahkan pula kolom fraction, yaitu proporsi masing-masing kategori dalam bentuk desimal. Hasil akhir berupa data frame yang menyajikan informasi kategori jenis kelamin, frekuensinya, persentasenya dalam format teks, serta proporsinya dalam bentuk numerik, yang bermanfaat untuk visualisasi data seperti diagram batang atau lingkaran.

df2=data.frame(table(datax$jeniskelamin))
names(df2)<- c("jeniskelamin","frekuensi")
df2$label<- paste0(round((df2$frekuensi/sum(df2$frekuensi))*100,2),"%")
df2$fraction <- df2$frekuensi / sum(df2$frekuensi)
df2
##   jeniskelamin frekuensi  label  fraction
## 1    LAKI LAKI     44775 79.96% 0.7995536
## 2    PEREMPUAN     11225 20.04% 0.2004464

Kode berikut digunakan untuk membuat visualisasi diagram lingkaran (pie chart) berdasarkan data frekuensi kategori jenis kelamin dalam data frame df2. Argumen aes(x="", y=frekuensi, fill=jeniskelamin) menunjukkan bahwa grafik dibentuk tanpa sumbu x (diberi string kosong), dengan tinggi batang ditentukan oleh nilai frekuensi, dan warna isian (fill) berdasarkan kategori jeniskelamin. Fungsi geom_col(width = 1) digunakan untuk membuat batang kolom penuh yang akan diubah menjadi bentuk lingkaran. Transformasi ke diagram lingkaran dilakukan melalui coord_polar("y"), yang mengubah koordinat batang menjadi polar (melingkar) berdasarkan sumbu y. Terakhir, theme_void() digunakan untuk menghilangkan elemen-elemen latar seperti garis sumbu dan label, sehingga grafik terlihat bersih dan fokus pada tampilan pie chart itu sendiri.

ggplot(df2, aes(x="", y=frekuensi, fill=jeniskelamin))+
  geom_col(width = 1)+
  coord_polar("y")+
  theme_void()

Kode berikut untuk membuat pie chart yang menampilkan persentase distribusi kategori jeniskelamin dari data frame df2 secara visual dengan label. Visualisasi dimulai dengan menggunakan ggplot() yang diatur dengan sumbu x kosong, nilai y berdasarkan frekuensi, dan warna isian ditentukan oleh kategori jeniskelamin. Fungsi geom_bar() digunakan untuk membuat batang dengan lebar penuh (width = 1) dan stat = "identity" agar tinggi batang sesuai dengan nilai frekuensi. Argumen position = 'fill' membuat total batang dinormalisasi menjadi 1, yang kemudian dikonversi menjadi pie chart melalui coord_polar("y"). Tampilan diperhalus dengan theme_void() untuk menghilangkan elemen latar belakang. Selanjutnya, geom_text() ditambahkan ke grafik untuk menyisipkan label persentase dari kolom label di tengah setiap segmen pie. Argumen position = position_fill(vjust = 0.5) digunakan agar label berada di tengah-tengah proporsi setiap kategori. Ukuran dan warna teks juga diatur agar dapat terbaca dengan jelas. Hasil akhirnya adalah pie chart yang tidak hanya menggambarkan proporsi kategori secara visual, tetapi juga memberikan informasi persentase secara eksplisit pada setiap segmen.

pie=ggplot(df2, aes(x="", y=frekuensi, fill=jeniskelamin))+
  geom_bar(width = 1, stat = "identity", position = 'fill')+
  coord_polar("y")+
  theme_void()
pie2=pie+geom_text(aes(label = label), size=5,color = "black", position = position_fill(vjust = 0.5))
pie2

Pie Chart Modifikasi

Kode pertama berikut menambahkan skema warna menggunakan scale_fill_brewer(palette = "Spectral"), yang merupakan bagian dari ColorBrewer, sebuah pustaka palet warna yang dirancang agar mudah dibedakan dan ramah untuk keperluan visualisasi data. Palet “Spectral” memberikan gradasi warna yang mencolok dan kontras, cocok digunakan untuk membedakan kategori seperti jenis kelamin dalam pie chart. Kode kedua menggunakan scale_fill_manual(values = c("#00FFFF", "#FFFF00")) untuk menetapkan warna secara manual. Warna #00FFFF (cyan) dan #FFFF00 (kuning) digunakan untuk menggantikan warna default, memberikan kontrol penuh kepada pengguna atas estetika visual. Pendekatan ini berguna ketika pengguna ingin menyesuaikan warna grafik dengan tema tertentu, misalnya untuk kebutuhan presentasi atau publikasi.

pie2 + scale_fill_brewer(palette="Spectral")

pie2 + scale_fill_manual(values=c("#00FFFF", "#FFFF00"))

Doughnut Chart

Kode pertama berikut digunakan untuk membuat pie chart berbentuk donat (doughnut chart) dengan label persentase di tengah-tengah setiap segmen. Nilai x = 2 digunakan sebagai posisi lingkaran agar dapat disesuaikan menjadi donat menggunakan xlim(1, 3), sehingga bagian tengah grafik tampak kosong. Fungsi geom_bar() membentuk batang yang akan diubah menjadi segmen lingkaran melalui coord_polar("y"). Argumen position = "fill" memastikan bahwa semua batang dinormalisasi agar membentuk satu lingkaran utuh. Label persentase ditambahkan dengan geom_text() dan diletakkan di tengah-tengah segmen menggunakan position_fill(vjust = 0.5). theme_void() menghapus latar belakang dan elemen sumbu untuk tampilan bersih. Kode kedua merupakan variasi lain dari pie chart berbentuk donat, namun labelnya ditambahkan menggunakan geom_label() yang memberi efek latar belakang seperti kotak pada setiap label. Selain menggunakan posisi x = 2 dan xlim(1, 3) untuk membentuk lingkaran donat, kode ini menyetel letak label berdasarkan nilai y = fraction - 0.1, sehingga label tampil sedikit lebih masuk ke dalam tiap segmen pie. Fungsi show.legend = FALSE digunakan untuk menyembunyikan legenda agar grafik lebih fokus pada isi pie chart. Pendekatan ini berguna untuk menampilkan informasi persentase secara eksplisit dengan visual yang lebih menarik dan mudah dibaca.

ggplot(df2, aes(x=2, y=frekuensi, fill=jeniskelamin))+
  geom_bar(width=1,stat = "identity", position = 'fill')+
  coord_polar("y")+
  theme_void()+xlim(1,3)+
  geom_text(aes(label = label), size=5,color = "black", position = position_fill(vjust = 0.5))

ggplot(df2, aes(x=2, y=frekuensi, fill=jeniskelamin))+
  geom_bar(width=1,stat = "identity",position="fill")+
  coord_polar("y")+xlim(1,3)+
  theme_void()+
  geom_label(aes(y = fraction-0.1,label=label), size=4.5,color = "black", show.legend = F)

Kode geom_label_repel() dari paket ggrepel untuk menambahkan label ke grafik dengan posisi yang otomatis disesuaikan agar tidak saling tumpang tindih. Argumen aes(y = frekuensi/2, label = label) menentukan bahwa label akan ditempatkan pada posisi tengah setiap batang berdasarkan nilai frekuensi, dengan teks diambil dari kolom label. Ukuran teks diatur dengan size = 4.5, dan warnanya ditetapkan sebagai hitam untuk memastikan keterbacaan. Argumen nudge_x = 0.5 digunakan untuk menggeser posisi label secara horizontal agar menjauh dari pusat grafik, terutama berguna dalam visualisasi pie chart berbentuk donat agar label tidak berada di dalam lingkaran. show.legend = FALSE digunakan untuk menyembunyikan legenda label. Dengan pendekatan ini, label ditampilkan secara rapi dan informatif tanpa saling bertumpuk, meningkatkan kualitas visualisasi data.

library(ggrepel)
ggplot(df2, aes(x=2, y=frekuensi, fill=jeniskelamin))+
  geom_bar(width=1,stat = "identity")+
  coord_polar("y")+xlim(1,3)+
  theme_void()+
  geom_label_repel(aes(y = frekuensi/2,label=label), 
                   size=4.5,color = "black", show.legend = F,nudge_x = 0.5)

# install.packages("webr") install terlebih dahulu memerlukan waktu beberapa menit
library(webr)

Doughnut dengan webr

Fungsi PieDonut() digunakan untuk membuat visualisasi gabungan antara pie chart dan donut chart yang menggambarkan hubungan antara dua variabel kategorik. Visualisasi ini efektif untuk menunjukkan proporsi secara hierarkis, dengan lingkaran luar (donut) sebagai subdivisi dari lingkaran dalam (pie). Baris pertama PieDonut(df2, aes(jeniskelamin, count = frekuensi)) digunakan untuk menampilkan distribusi satu variabel kategorik, yaitu jeniskelamin, berdasarkan frekuensinya dalam data df2. Baris kedua PieDonut(datax, aes(jeniskelamin, pendidikan)) membentuk visualisasi dua tingkat, di mana lingkaran dalam menunjukkan kategori jeniskelamin dan lingkaran luar menunjukkan pembagian kategori pendidikan dalam masing-masing kelompok jenis kelamin. Baris ketiga PieDonut(datax, aes(pendidikan, jeniskelamin)) membalik urutan hierarki, sehingga lingkaran dalam menunjukkan kategori pendidikan, dan lingkaran luar membagi berdasarkan jeniskelamin. Baris keempat PieDonut(datax, aes(pendidikan, jeniskelamin), explode = 1) menambahkan efek explode (jarak antar segmen) pada lingkaran pie, untuk memperjelas batas antara segmen kategori pendidikan. Baris kelima PieDonut(datax, aes(pendidikan, jeniskelamin), explode = 1, explodeDonut = TRUE) selain menambahkan jarak pada lingkaran pie, juga menambahkan jarak antar segmen pada lingkaran donut, sehingga visualisasi lebih terbuka dan perbedaan kategori lebih menonjol.

PieDonut(df2,aes(jeniskelamin,count=frekuensi))

PieDonut(datax,aes(jeniskelamin,pendidikan))

PieDonut(datax,aes(pendidikan,jeniskelamin))

PieDonut(datax,aes(pendidikan,jeniskelamin),explode=1)

PieDonut(datax,aes(pendidikan,jeniskelamin),explode=1,explodeDonut = T)

Pertama, dibuat data frame df4 yang berisi tabulasi silang antara variabel pendidikan dan jeniskelamin dari dataset datax menggunakan fungsi table(), lalu dikonversi menjadi data frame dengan stringsAsFactors = TRUE. Nama kolom kemudian disesuaikan menjadi 'pendidikan', 'JK', dan 'Freq' agar lebih deskriptif. Visualisasi dilakukan dengan PieDonut(df4, aes(JK, pendidikan, count = Freq)), yang menampilkan jeniskelamin sebagai kategori pada lingkaran pie (dalam), dan pendidikan sebagai subkategori pada lingkaran donut (luar). Parameter r0 = 0.5, r1 = 1, dan r2 = 1.3 mengatur radius masing-masing lapisan lingkaran, di mana r0 adalah radius bagian kosong di tengah, r1 adalah radius pie utama, dan r2 adalah radius donut bagian luar. Pengaturan ini memberikan tampilan hierarki visual yang jelas dan estetis untuk memperlihatkan distribusi proporsi secara bertingkat antar dua variabel kategorik.

df4<-data.frame(table(datax$pendidikan,datax$jeniskelamin),stringsAsFactors = T)
colnames(df4)<-c('pendidikan','JK','Freq')
PieDonut(df4,aes(JK,pendidikan,count=Freq),r0=0.5,r1=1,r2=1.3)

Boxplot

Boxplot Sederhana

Berikut ini kode untuk membuat diagram boxplot (box-and-whisker plot) guna menggambarkan distribusi variabel numerik lamabekerja dari dataset datax. Fungsi ggplot() digunakan untuk menginisialisasi objek grafik dengan sumbu y diisi oleh variabel lamabekerja, sedangkan sumbu x dikosongkan karena hanya satu variabel yang dianalisis. Fungsi geom_boxplot() kemudian menampilkan ringkasan lima nilai statistik penting, yaitu minimum, kuartil pertama (Q1), median, kuartil ketiga (Q3), dan maksimum, serta mengidentifikasi nilai pencilan (outlier) jika ada. Visualisasi ini sangat berguna untuk melihat sebaran data, mendeteksi keberadaan outlier, serta memahami simetri atau kemiringan distribusi lamabekerja.

ggplot(datax, aes(y=lamabekerja)) + geom_boxplot()

Boxplot Modifikasi

Baris kode pertama berikut menampilkan boxplot dari variabel numerik lamabekerja tanpa membedakan kelompok, hanya dengan sumbu y. Warna isi boxplot diatur menggunakan fill = "#00FFFF" untuk memberikan tampilan yang lebih menarik secara visual. Plot ini memberikan gambaran umum distribusi lama bekerja seluruh responden. Baris kedua menambahkan variabel kategorik jeniskelamin pada sumbu x, sehingga boxplot dikelompokkan berdasarkan kategori jenis kelamin. Visualisasi ini memungkinkan perbandingan distribusi lamabekerja antar kelompok jeniskelamin.Baris ketiga memperjelas perbedaan antar kelompok jenis kelamin dengan menambahkan parameter fill = jeniskelamin, sehingga setiap boxplot diwarnai sesuai kategorinya. Ini membantu mempertegas perbedaan visual antar kelompok.Baris keempat merupakan variasi dari baris sebelumnya, namun dengan tambahan theme_minimal() yang memberikan tampilan grafik yang lebih bersih dan sederhana dengan mengurangi elemen latar belakang, sehingga fokus utama tetap pada data yang ditampilkan. Keempat variasi ini sangat berguna untuk eksplorasi awal dan identifikasi perbedaan distribusi berdasarkan kategori tertentu.

ggplot(datax, aes(y=lamabekerja)) + geom_boxplot(fill="#00FFFF")

ggplot(datax, aes(x=jeniskelamin, y=lamabekerja)) + 
  geom_boxplot()

ggplot(datax, aes(x=jeniskelamin, y=lamabekerja, fill=jeniskelamin)) + 
  geom_boxplot()

ggplot(datax, aes(x=jeniskelamin, y=lamabekerja, fill=jeniskelamin)) + 
  geom_boxplot()+theme_minimal()

Baris kode pertama berikut menggunakan scale_fill_brewer(palette = "Spectral"), yaitu salah satu palet dari ColorBrewer yang menyediakan gradasi warna beragam dengan kontras tinggi. Palet ini sangat cocok digunakan dalam visualisasi dengan banyak kategori atau ketika ingin menampilkan perbedaan warna yang mencolok namun tetap estetis dan mudah dibedakan. Baris kedua menggunakan scale_fill_manual(values = c("#00FFFF", "#FFFF00")) untuk menetapkan warna isian secara manual. Dalam hal ini, warna cyan (#00FFFF) dan kuning (#FFFF00) digunakan untuk masing-masing kategori jenis kelamin. Pendekatan manual ini memberi kontrol penuh kepada pengguna untuk menyesuaikan skema warna agar selaras dengan tema visual atau identitas grafis tertentu.

bp=ggplot(datax, aes(x=jeniskelamin, y=lamabekerja, fill=jeniskelamin)) + 
  geom_boxplot()+theme_minimal()
bp + scale_fill_brewer(palette="Spectral")

bp+ scale_fill_manual(values=c("#00FFFF", "#FFFF00"))

Baris kode pertama menggunakan facet_wrap(~pendidikan, scales = 'free') yang memisahkan grafik berdasarkan kategori variabel pendidikan. Masing-masing kategori ditampilkan dalam panel tersendiri yang disusun secara melingkar (wrap), dan scales = 'free' memungkinkan setiap panel memiliki skala sumbu y yang berbeda sesuai dengan distribusi datanya. Ini sangat bermanfaat ketika variasi antar kategori cukup besar dan tidak proporsional.Baris kedua menggunakan facet_grid(jenispekerjaan ~ pendidikan, scales = 'fixed'), yang membentuk susunan grid dua arah: baris berdasarkan jenispekerjaan dan kolom berdasarkan pendidikan. Dengan scales = 'fixed', semua panel menggunakan skala sumbu y yang sama, sehingga memudahkan perbandingan langsung antar kombinasi kategori. Visualisasi ini efektif untuk mengeksplorasi interaksi antara dua variabel kategorik terhadap distribusi lamabekerja (atau variabel lain dalam bp2).

bp2=ggplot(datax, aes(x=jeniskelamin, y=lamabekerja,fill=jeniskelamin)) + 
  geom_boxplot()+theme_minimal()
bp2+facet_wrap(~pendidikan,scales = 'free')

bp2+facet_grid(jenispekerjaan~pendidikan,scales = 'fixed')

Kode berikut ini digunakan untuk membuat visualisasi boxplot dari variabel lamabekerja berdasarkan kategori jeniskelamin dalam dataset datax, dengan tambahan anotasi untuk menampilkan nilai outlier secara langsung di grafik. Visualisasi diawali dengan ggplot() dan geom_boxplot() untuk menampilkan distribusi data lamabekerja per kategori jenis kelamin, termasuk nilai minimum, kuartil, median, dan maksimum. Tema theme_minimal() digunakan untuk memberikan tampilan grafik yang bersih dan sederhana, menghilangkan elemen-elemen visual yang tidak penting agar fokus tetap pada isi grafik. Fungsi stat_summary() ditambahkan untuk menyisipkan teks ke dalam grafik berdasarkan ringkasan statistik. Di dalamnya, digunakan fungsi boxplot.stats(y)$out untuk mengambil nilai outlier dari data. Jika tidak ada outlier, maka label tidak akan ditampilkan (NA). Nilai-nilai outlier tersebut dibulatkan satu desimal dan ditampilkan sebagai label teks di sekitar titik outlier. Argumen hjust = -1 menggeser posisi teks ke kiri agar tidak menimpa titik data. Dengan pendekatan ini, grafik tidak hanya menampilkan sebaran data, tetapi juga menyoroti dan memberi informasi eksplisit mengenai nilai-nilai outlier yang terdeteksi.

ggplot(datax, aes(x=jeniskelamin, y=lamabekerja)) + 
  geom_boxplot() +
  theme_minimal()+
  stat_summary(
    aes(label = round(stat(y), 1)),
    geom = "text", 
    fun = function(y) { o <- boxplot.stats(y)$out; if(length(o) == 0) NA else o },
    hjust = -1
  )

Histogram

Histogram Sederhana

Kedua baris kode berikut ini digunakan untuk membuat visualisasi distribusi dari variabel numerik lamabekerja dalam bentuk histogram menggunakan ggplot2. Baris pertama menggunakan geom_bar() yang secara default menghitung frekuensi berdasarkan jumlah kasus per nilai unik, dan ditambahkan fungsi stat_bin(bins = 10) untuk mengatur jumlah interval (bin) sebanyak 10. Meskipun geom_bar() umumnya digunakan untuk data kategorik, ketika digunakan bersama stat_bin(), fungsi ini dapat mengelompokkan data numerik ke dalam kelas-kelas tertentu secara otomatis.Baris kedua menggunakan geom_histogram(bins = 20) yang secara eksplisit membentuk histogram dengan 20 kelas. Histogram ini lebih sesuai untuk menggambarkan distribusi data kontinu seperti lamabekerja, karena geom_histogram() secara langsung menghitung dan menampilkan jumlah observasi dalam setiap kelas yang ditentukan. Tema theme_minimal() diterapkan untuk menyederhanakan tampilan grafik, memberikan kesan visual yang bersih dan modern.Kedua grafik ini berguna untuk mengidentifikasi pola distribusi data, seperti simetri, kemencengan, atau keberadaan data ekstrem pada variabel lamabekerja.

ggplot(datax, aes(x=lamabekerja)) + 
  geom_bar()+stat_bin(bins=10)

ggplot(datax, aes(x=lamabekerja)) + 
  geom_histogram(bins = 20)+
  theme_minimal()

Histogram Modifikasi

Kedua kode berikut ini digunakan untuk membuat histogram dari variabel lamabekerja dalam dataset datax, dengan pendekatan visual yang berbeda untuk menampilkan distribusi data. Pada baris pertama, histogram dibentuk menggunakan geom_histogram() dengan jumlah kelas (bins) sebanyak 30. Warna batas antar batang diatur hitam (color = "black"), sedangkan warna isi batang biru dengan transparansi 20% (fill = "blue", alpha = 0.2). Transparansi ini berguna agar histogram terlihat ringan dan tidak terlalu dominan, terutama jika nantinya dikombinasikan dengan elemen visual lain. Tema theme_minimal() digunakan untuk menyederhanakan tampilan grafik agar lebih bersih. Baris kedua membentuk histogram yang tidak lagi menampilkan frekuensi absolut, melainkan menampilkan kepadatan data (aes(y = ..density..)), yang merupakan pendekatan umum dalam analisis distribusi probabilitas. Warna batas batang tetap hitam dan isinya diwarnai dengan cyan (fill = "#00FFFF"), tanpa transparansi. Penggunaan ..density.. pada sumbu y memungkinkan integrasi histogram dengan kurva distribusi teoretis seperti distribusi normal, jika diperlukan. Perbedaan utama antara keduanya adalah bahwa histogram pertama menampilkan jumlah observasi di setiap kelas, sedangkan histogram kedua menampilkan nilai densitas yang dapat ditafsirkan dalam konteks distribusi probabilitas.

ggplot(datax, aes(x=lamabekerja)) +
  geom_histogram(bins=30,color="black",fill="blue",alpha=0.2)+
  theme_minimal()

ggplot(datax, aes(x=lamabekerja)) +
  geom_histogram(aes(y=..density..),color="black",fill="#00FFFF",bins=30)+
  theme_minimal()

Rangkaian kode berikut ini digunakan untuk membuat visualisasi distribusi variabel lamabekerja dalam bentuk histogram yang dipadukan dengan kurva densitas, serta diperluas dengan faceting berdasarkan kategori pendidikan. Langkah pertama membuat objek hp, yaitu histogram dari variabel lamabekerja yang menampilkan nilai kepadatan (density) pada sumbu y. Histogram dibuat menggunakan geom_histogram() dengan jumlah kelas sebanyak 30, warna batas batang hitam, dan isian cyan (#00FFFF). Tema theme_minimal() digunakan untuk memberikan tampilan bersih dan sederhana. Langkah kedua membentuk objek hp2 dengan menambahkan geom_density() ke histogram. Kurva densitas ini digambar dengan garis berwarna hitam dan ketebalan sedang (size = 0.9), yang membantu mengilustrasikan pola distribusi data secara lebih halus dan kontinu di atas histogram. Hasil visualisasi ini memberikan informasi visual tentang bentuk distribusi data lamabekerja, seperti apakah simetris, miring, atau multimodal. Langkah ketiga membuat objek hp3 dengan menambahkan facet_wrap(~pendidikan, scales = "fixed", nrow = 3, ncol = 2) ke hp2, yang memecah histogram dan kurva densitas ke dalam panel-panel berdasarkan kategori pendidikan. Pengaturan scales = "fixed" menjaga agar skala sumbu y tetap konsisten di semua panel, sehingga memudahkan perbandingan antar kategori. Parameter nrow dan ncol mengatur tata letak panel menjadi 3 baris dan 2 kolom.

hp=ggplot(datax, aes(x=lamabekerja)) +
  geom_histogram(aes(y=..density..),color="black",fill="#00FFFF",bins=30)+
  theme_minimal() 

hp2=hp+geom_density(color="black",size=0.9)
hp2

hp3=hp2+facet_wrap(~pendidikan, scales = "fixed",nrow = 3,ncol=2)
hp3

Density Plot

Density Plot Sederhana

Rangkaian kode ini digunakan untuk membuat visualisasi kurva kepadatan (density plot) dari variabel numerik lamabekerja dalam dataset datax, yang berguna untuk menggambarkan bentuk distribusi data secara halus dan kontinu. Objek gd didefinisikan sebagai plot dasar dengan sumbu x berisi lamabekerja. Baris pertama menambahkan geom_density() untuk menggambar kurva densitas berwarna hitam dengan isian berwarna abu-abu (fill = "gray"). Argumen outline.type = "upper" digunakan untuk menampilkan garis luar pada bagian atas kurva, namun perlu dicatat bahwa outline.type bukan argumen standar geom_density() — ini kemungkinan keliru atau berasal dari konteks fungsi lain seperti geom_violin().

Baris kedua menggunakan stat_density() sebagai alternatif dari geom_density() yang memberikan hasil serupa, yaitu menampilkan kurva distribusi berdasarkan estimasi kernel density dari data. Baris ketiga menggabungkan beberapa elemen visual: geom_density() dengan garis luar penuh (outline.type = "full") untuk menampilkan seluruh kontur distribusi, dan geom_vline() untuk menambahkan garis vertikal pada nilai rata-rata lamabekerja. Garis rata-rata ditampilkan dengan warna oranye kemerahan (#FC4E07), garis putus-putus (linetype = "dashed"), dan ketebalan garis size = 1. Penambahan garis ini memberikan penekanan visual terhadap posisi rata-rata pada kurva distribusi.

gd<-ggplot(datax, aes(x = lamabekerja))
gd+geom_density(color = "black", fill = "gray",outline.type = "upper")

gd+stat_density()

gd+geom_density(color = "black", fill = "gray",outline.type = "full")+
  geom_vline(aes(xintercept=mean(lamabekerja)),color="#FC4E07", linetype="dashed", size=1)

Density Plot Modifikasi

Rangkaian kode ini digunakan untuk membuat visualisasi kurva kepadatan (density plot) dari data simulasi dataku, yang terdiri dari 200 observasi dengan dua kategori jenis kelamin (JK) dan variabel numerik bobot. Data disimulasikan menggunakan distribusi normal, dengan rata-rata 55 untuk perempuan (F) dan 58 untuk laki-laki (M). Objek dasar gd2 didefinisikan menggunakan ggplot() dengan sumbu x berisi nilai bobot.

set.seed(1234)
dataku = data.frame(
  JK = factor(rep(c("F", "M"), each=100)),
  bobot = c(rnorm(100, 55), rnorm(100, 58)))
dataku
##     JK    bobot
## 1    F 53.79293
## 2    F 55.27743
## 3    F 56.08444
## 4    F 52.65430
## 5    F 55.42912
## 6    F 55.50606
## 7    F 54.42526
## 8    F 54.45337
## 9    F 54.43555
## 10   F 54.10996
## 11   F 54.52281
## 12   F 54.00161
## 13   F 54.22375
## 14   F 55.06446
## 15   F 55.95949
## 16   F 54.88971
## 17   F 54.48899
## 18   F 54.08880
## 19   F 54.16283
## 20   F 57.41584
## 21   F 55.13409
## 22   F 54.50931
## 23   F 54.55945
## 24   F 55.45959
## 25   F 54.30628
## 26   F 53.55180
## 27   F 55.57476
## 28   F 53.97634
## 29   F 54.98486
## 30   F 54.06405
## 31   F 56.10230
## 32   F 54.52441
## 33   F 54.29056
## 34   F 54.49874
## 35   F 53.37091
## 36   F 53.83238
## 37   F 52.81996
## 38   F 53.65901
## 39   F 54.70571
## 40   F 54.53410
## 41   F 56.44950
## 42   F 53.93136
## 43   F 54.14464
## 44   F 54.71938
## 45   F 54.00566
## 46   F 54.03149
## 47   F 53.89268
## 48   F 53.74801
## 49   F 54.47617
## 50   F 54.50315
## 51   F 53.19397
## 52   F 54.41792
## 53   F 53.89111
## 54   F 53.98504
## 55   F 54.83769
## 56   F 55.56306
## 57   F 56.64782
## 58   F 54.22665
## 59   F 56.60591
## 60   F 53.84219
## 61   F 55.65659
## 62   F 57.54899
## 63   F 54.96524
## 64   F 54.33037
## 65   F 54.99240
## 66   F 56.77708
## 67   F 53.86139
## 68   F 56.36783
## 69   F 56.32956
## 70   F 55.33647
## 71   F 55.00689
## 72   F 54.54453
## 73   F 54.63348
## 74   F 55.64829
## 75   F 57.07027
## 76   F 54.84660
## 77   F 53.60930
## 78   F 54.27642
## 79   F 55.25826
## 80   F 54.68294
## 81   F 54.82221
## 82   F 54.83001
## 83   F 53.62770
## 84   F 54.82621
## 85   F 55.85023
## 86   F 55.69761
## 87   F 55.55000
## 88   F 54.59727
## 89   F 54.80841
## 90   F 53.80547
## 91   F 54.94684
## 92   F 55.25520
## 93   F 56.70596
## 94   F 56.00151
## 95   F 54.50442
## 96   F 55.35555
## 97   F 53.86539
## 98   F 55.87820
## 99   F 55.97292
## 100  F 57.12112
## 101  M 58.41452
## 102  M 57.52528
## 103  M 58.06599
## 104  M 57.49752
## 105  M 57.17400
## 106  M 58.16699
## 107  M 57.10374
## 108  M 58.16819
## 109  M 58.35497
## 110  M 57.94789
## 111  M 57.80407
## 112  M 57.35093
## 113  M 56.89023
## 114  M 58.84927
## 115  M 58.02236
## 116  M 58.83114
## 117  M 56.75571
## 118  M 58.16903
## 119  M 58.67317
## 120  M 57.97372
## 121  M 57.80861
## 122  M 57.21809
## 123  M 60.05816
## 124  M 58.75050
## 125  M 59.82421
## 126  M 58.08006
## 127  M 57.36859
## 128  M 56.48671
## 129  M 57.36390
## 130  M 58.22630
## 131  M 59.01369
## 132  M 58.25275
## 133  M 56.82805
## 134  M 58.66871
## 135  M 56.34990
## 136  M 57.63415
## 137  M 57.68388
## 138  M 56.05175
## 139  M 58.92006
## 140  M 57.37713
## 141  M 57.66596
## 142  M 59.39515
## 143  M 58.63667
## 144  M 57.89157
## 145  M 58.51376
## 146  M 58.39927
## 147  M 59.66286
## 148  M 58.27589
## 149  M 58.50627
## 150  M 58.34755
## 151  M 57.62276
## 152  M 58.09762
## 153  M 59.63874
## 154  M 57.12441
## 155  M 58.12176
## 156  M 59.36213
## 157  M 57.76538
## 158  M 56.94662
## 159  M 57.13022
## 160  M 57.60987
## 161  M 57.15265
## 162  M 57.73936
## 163  M 57.58558
## 164  M 57.81695
## 165  M 58.40706
## 166  M 58.62463
## 167  M 59.67821
## 168  M 57.93131
## 169  M 57.67916
## 170  M 59.47101
## 171  M 59.70433
## 172  M 58.04324
## 173  M 57.66734
## 174  M 56.17776
## 175  M 59.41126
## 176  M 57.16242
## 177  M 56.87624
## 178  M 61.04377
## 179  M 58.23502
## 180  M 57.96674
## 181  M 55.26778
## 182  M 57.90021
## 183  M 58.97603
## 184  M 58.41387
## 185  M 58.91232
## 186  M 59.98373
## 187  M 59.16911
## 188  M 57.49126
## 189  M 58.70418
## 190  M 57.80158
## 191  M 57.46193
## 192  M 55.14424
## 193  M 57.21035
## 194  M 58.48781
## 195  M 60.16803
## 196  M 58.50069
## 197  M 58.62021
## 198  M 57.03410
## 199  M 58.16265
## 200  M 55.92176

Baris pertama menambahkan geom_density() dengan isian berwarna biru dan transparansi 40% (alpha = 0.4). Kurva ini menggambarkan distribusi keseluruhan data bobot tanpa membedakan jenis kelamin. Catatan: argumen outline.type = 'full' bukan argumen valid dalam geom_density() dan bisa diabaikan atau dianggap berasal dari konteks fungsi lain. Baris kedua membuat kurva kepadatan terpisah untuk setiap kategori JK, dengan warna garis berbeda untuk masing-masing kategori melalui aes(color = JK). Pendekatan ini menekankan perbedaan bentuk distribusi antara kelompok laki-laki dan perempuan.

Baris ketiga menggunakan aes(fill = JK) untuk mewarnai area bawah kurva berdasarkan kategori JK, dikombinasikan dengan transparansi (alpha = 0.4) agar tumpang tindih antar kurva tetap terlihat. Ini memberikan visualisasi yang informatif dan menarik secara estetis. Baris keempat menambahkan elemen garis rata-rata keseluruhan data bobot menggunakan geom_vline(), dengan garis putus-putus berwarna jingga kemerahan (#FC4E07). Ini membantu menunjukkan posisi nilai rata-rata secara visual terhadap distribusi dari masing-masing kelompok.

gd2<-ggplot(dataku, aes(x = bobot))

gd2+geom_density(fill='blue',alpha=0.4,outline.type = 'full')

gd2 + geom_density(aes(color = JK),outline.type = 'full')

gd2 + geom_density(aes(fill = JK),outline.type = 'full',alpha=0.4)

gd2 + geom_density(aes(fill = JK),outline.type = 'full',alpha=0.4)+
  geom_vline(data=dataku,aes(xintercept=mean(bobot)),color="#FC4E07", linetype="dashed", size=1)

Penggabungan Grafik

#install.packages("cowplot")
library("cowplot")

Kode berikut ini bertujuan untuk membandingkan berbagai tampilan visual dari grafik ggplot2 dengan menerapkan beberapa tema yang berbeda pada dataset mtcars. Setiap objek a hingga g mewakili satu jenis plot dengan variasi elemen grafis dan tema yang diterapkan.

  • Objek a merupakan scatter plot sederhana yang menampilkan hubungan antara variabel wt (berat mobil) dan mpg (efisiensi bahan bakar dalam mil per galon), menggunakan pengaturan default tanpa tema tambahan.

  • Objek b menggunakan geom_line() untuk menggambarkan garis hubungan antar titik data, dengan penerapan tema theme_bw() yang memberikan latar putih bersih dengan garis grid abu-abu.

  • Objek d menggambarkan distribusi dari variabel wt dalam bentuk kurva kepadatan (density plot), dengan isian biru transparan dan menggunakan theme_classic(), yang memberikan tampilan klasik dengan garis sumbu yang sederhana.

  • Objek e adalah histogram dari variabel mpg, berwarna hijau transparan, dengan jumlah kelas (bin) sebanyak 30. Tema theme_cowplot() digunakan untuk memberikan tampilan minimalis yang cocok untuk publikasi.

  • Objek f menampilkan scatter plot dengan titik-titik berwarna putih dan menggunakan theme_dark() untuk memberikan latar belakang hitam yang kontras, cocok untuk visualisasi di layar.

  • Objek g kembali menampilkan scatter plot dengan theme_minimal() untuk menghasilkan tampilan yang bersih dan modern dengan penghilangan elemen grafis yang tidak penting.

Akhirnya, semua grafik tersebut digabungkan dalam satu tampilan menggunakan fungsi plot_grid() dari paket cowplot. Fungsi ini menyusun keenam grafik dalam layout 3 kolom dan 2 baris (ncol = 3, nrow = 2), dan memberi label pada masing-masing panel dengan teks berwarna ungu (label_colour = "purple") dan ukuran huruf 12. Pengaturan hjust = -0.9 digunakan untuk mengatur posisi horizontal label agar lebih simetris. Visualisasi ini sangat berguna untuk membandingkan dampak estetika dari berbagai tema ggplot2 terhadap data yang sama.

a<-ggplot(data = mtcars, aes(x = wt, y = mpg))+geom_point()
b<-ggplot(data = mtcars, aes(x = wt, y = mpg))+geom_line()+theme_bw()
d<-ggplot(data = mtcars, aes(x = wt))+geom_density(fill='blue',alpha=0.4,outline.type = "full")+theme_classic()
e<-ggplot(data = mtcars, aes(x = mpg))+geom_histogram(fill='green',alpha=0.2,bins=30)+theme_cowplot()
f<-ggplot(data = mtcars, aes(x = wt, y = mpg))+geom_point(color="white")+
  theme_dark()
g<-ggplot(data = mtcars, aes(x = wt, y = mpg))+geom_point()+theme_minimal()

plot_grid(a,b,d,e,f,g, labels = c("Default", "theme_bw", 
                                  "theme_classic","theme_cowplot","theme_dark","theme_minimal"),
          ncol = 3, nrow = 2,label_size = 12,hjust = -0.9,label_colour = "purple")

Penyimpanan Grafik

#akan tersimpan pada folder yang sama dengan file script anda
ggsave("coba.png", width=10, height=10, dpi=300)