ggplot2

ggplot2 sebagai package untuk visualisasi data di R. Komponen-komponen penting di ggplot2 adalah plot, data, aesthetic mapping dan layer – yang merupakan komponen minimal untuk menghasilkan suatu grafik.

library(ggplot2) #memanggil package ggplot2
## Warning: package 'ggplot2' was built under R version 4.2.2

PLOT

Plot adalah komponen paling dasar di ggplot2, tanpa plot seluruh grafik tidak akan bisa ditampilkan. Dengan demikian, plot dapat dianalogikan sebagai “kanvas” gambar kita. Plot dibuat dengan function ggplot. Jika tidak digabungkan dengan komponen lain, maka tampilannya akan terlihat sebagai kotak persegi kosong dengan latar belakang abu-abu.

#Membuat Kanvas Kosong, Ketik function ggplot() di bawah ini
ggplot()

Judul dapat ditambahkan di ggplot dengan fungsi labs(title = "....").

#Penambahan judul dengan menggunakan fungsi labs
ggplot() + labs(title="Luas Wilayah vs Kepadatan Penduduk DKI Jakarta - Periode 2013")

Komponen plot dan layer dapat disimpan dalam satu variable. Misal, variable plot.jakarta yang menyimpan plot dan judul.

plot.jakarta <- ggplot()
plot.jakarta <- plot.jakarta + labs(title="Luas Wilayah vs Kepadatan Penduduk DKI Jakarta - Periode 2013", subtitle="Tahun 2013")

Kemudian menampilkan grafik dengan hanya menuliskan nama variable tersebut.

plot.jakarta

Function labs tidak hanya bisa diisi dengan judul dan subjudul, tapi bisa juga digunakan untuk memberi label pada sumbu x dan y.

#Menambahkan Label pada Sumbu X dan Y
plot.jakarta <- plot.jakarta + labs(x="Luas Wilayah (km2)", y="Kepadatan Jiwa per km2")
plot.jakarta

DATA DAN AESTHETIC MAPPING

Plot memerlukan dua input sebagai bahan bakunya agar bisa digunakan lebih jauh, yaitu data dan aesthetic mapping (pemetaan beberapa kolom data ke elemen visual). Plot bisa menerima input data, dan dari data tersebut bisa dipilih beberapa kolom yang akan “dipetakan” sebagai input untuk komponen visual. Pemetaan data ini disebut dengan aesthetic mapping. Input data pada ggplot2 harus bertipe data.frame. Contoh dataset yang akan digunakan adalah data wilayah dan kepadatan kependudukan Pemerintah Provinsi DKI Jakarta tahun 2013.

Membaca dataset dengan read.csv.

#Membaca data csv dan dimasukkan ke variable penduduk.dki
penduduk.dki <- read.csv("D:/LOOKER DAN R/modul R/data/dkikepadatankelurahan2013.csv", sep=",")
#Menampilkan data frame dari kolom " NAMA.KELURAHAN " dan "LUAS.WILAYAH..KM2."
head(penduduk.dki[c("NAMA.KELURAHAN","LUAS.WILAYAH..KM2.")])
##   NAMA.KELURAHAN LUAS.WILAYAH..KM2.
## 1    P. PANGGANG               0.91
## 2      P. KELAPA               3.76
## 3     P. HARAPAN               3.59
## 4 P. UNTUNG JAWA               0.59
## 5      P. TIDUNG               1.57
## 6        P. PARI               1.39

Memasukkan Data ke Plot: Data dapat dimasukkan ke dalam plot melalui argumen di function ggplot.

# Masukkan data ke dalam plot dan simpan sebagai variable plot.dki, dan tampilkan plot dan summary dari plot tersebut
plot.dki<-ggplot(data=penduduk.dki)
plot.dki

summary(plot.dki)
## data: TAHUN, NAMA.PROVINSI, NAMA.KABUPATEN.KOTA, NAMA.KECAMATAN,
##   NAMA.KELURAHAN, LUAS.WILAYAH..KM2., KEPADATAN..JIWA.KM2., X, X.1,
##   X.2, X.3, X.4, X.5, X.6, X.7, X.8, X.9, X.10, X.11, X35.39.Laki.Laki,
##   X35.39.Perempuan, X40.44.Laki.Laki, X40.44.Perempuan,
##   X45.49.Laki.Laki, X45.49.Perempuan, X50.54.Laki.Laki,
##   X50.54.Perempuan, X55.59.Laki.Laki, X55.59.Perempuan,
##   X60.64.Laki.Laki, X60.64.Perempuan, X65.69.Laki.Laki,
##   X65.69.Perempuan, X70.74.Laki.Laki, X70.74.Perempuan, X.75.Laki.Laki,
##   X.75..Perempuan [267x37]
## faceting: <ggproto object: Class FacetNull, Facet, gg>
##     compute_layout: function
##     draw_back: function
##     draw_front: function
##     draw_labels: function
##     draw_panels: function
##     finish_data: function
##     init_scales: function
##     map_data: function
##     params: list
##     setup_data: function
##     setup_params: function
##     shrink: TRUE
##     train_scales: function
##     vars: function
##     super:  <ggproto object: Class FacetNull, Facet, gg>

Memetakan x, y dan color dengan function aes. Setelah data dimasukkan pada plot, saatnya memetakan kolom yang diperlukan pada data tersebut ke elemen visual. Pemetaan ini disebut dengan aesthetic mapping. function aes ini harus dipasangkan dengan function ggplot yang telah memiliki data.

#Memetakan x, y dan color dengan function aes
#Menambahkan data dan aesthetic mapping
plot.dki <- ggplot(data=penduduk.dki, aes(x = LUAS.WILAYAH..KM2.,  y=KEPADATAN..JIWA.KM2.,  color=NAMA.KABUPATEN.KOTA))
plot.dki

summary(plot.dki)
## data: TAHUN, NAMA.PROVINSI, NAMA.KABUPATEN.KOTA, NAMA.KECAMATAN,
##   NAMA.KELURAHAN, LUAS.WILAYAH..KM2., KEPADATAN..JIWA.KM2., X, X.1,
##   X.2, X.3, X.4, X.5, X.6, X.7, X.8, X.9, X.10, X.11, X35.39.Laki.Laki,
##   X35.39.Perempuan, X40.44.Laki.Laki, X40.44.Perempuan,
##   X45.49.Laki.Laki, X45.49.Perempuan, X50.54.Laki.Laki,
##   X50.54.Perempuan, X55.59.Laki.Laki, X55.59.Perempuan,
##   X60.64.Laki.Laki, X60.64.Perempuan, X65.69.Laki.Laki,
##   X65.69.Perempuan, X70.74.Laki.Laki, X70.74.Perempuan, X.75.Laki.Laki,
##   X.75..Perempuan [267x37]
## mapping:  x = ~LUAS.WILAYAH..KM2., y = ~KEPADATAN..JIWA.KM2., colour = ~NAMA.KABUPATEN.KOTA
## faceting: <ggproto object: Class FacetNull, Facet, gg>
##     compute_layout: function
##     draw_back: function
##     draw_front: function
##     draw_labels: function
##     draw_panels: function
##     finish_data: function
##     init_scales: function
##     map_data: function
##     params: list
##     setup_data: function
##     setup_params: function
##     shrink: TRUE
##     train_scales: function
##     vars: function
##     super:  <ggproto object: Class FacetNull, Facet, gg>

LAYER

Grafik bisa dihasilkan dengan menambahkan layer secara berlapis di atas plot. Layer diperlukan agar grafik sebenarnya dapat digambar di atas objek plot. Layer dibuat dengan function layer. Parameter function layer yang harus diisi terdiri dari geom, stat dan position.

Scatter Plot

Scatter Plot Kepadatan Penduduk Jakarta dengan function layer.

#layer untuk menghasilkan grafik scatter plot
plot.dki + layer(geom = "point", stat = "identity", position = "identity")

Atau dapat juga dengan menggunakan Function geom_point.

#Scatter Plot Kepadatan Penduduk Jakarta dengan geom_point
plot.dki + geom_point()

Catatan: Stat dan position tidak perlu diisi, karena fungsi geom_point ini secara otomatis akan memiliki nilai “identity” untuk stat dan position. Berbeda ketika menggunakan layer, dimana parameter stat dan position harus diisi lengkap.

#Menambahkan Judul dan Label
plot.dki + geom_point() + 
  theme(plot.title = element_text(hjust=0.5)) +
  labs(title="Luas Wilayah vs Kepadatan Penduduk DKI Jakarta", x="Luas wilayah (km2)", y="Kepadatan Jiwa per km2", color="Nama Kabupaten/Kota")

Histogram

Histogram adalah tipe visualisasi yang sangat cocok untuk menggambarkan data distribusi dari jumlah populasi data. Layer histogram ini memerlukan stat bertipe bin, yaitu membagi data menjadi interval. Namun dengan penggunaan geom_histogram, stat ini sudah menjadi bin secara default jadi tidak perlu lagi dispesifikasikan. Secara default geom histogram tidak memerlukan aesthetic mapping untuk sumbu y, cukup menggunakan sumbu x. Namun ada parameter yang perlu diinput, yaitu besarnya interval bin, menggunakan parameter binwidth.

#Layer geom_histogram dan Lebar Interval
#Menambahkan data dan aesthetic mapping
plot.dki.histogram<- ggplot(data=penduduk.dki, aes(x = KEPADATAN..JIWA.KM2.))
plot.dki.histogram + geom_histogram(binwidth=10000)

Terlihat bahwa jumlah kelurahan dengan penduduk antara 10 s/d 20 ribu adalah yang terbanyak.

Selain itu, kita dapat melihat porsi jumlah kelurahan berdasarkan nama kabupaten / kota pada tiap rentang histogram sebagai berikut.

#Penggunaaan aesthetic fill
plot.dki.histogram<- ggplot(data=penduduk.dki, aes(x = KEPADATAN..JIWA.KM2., fill=NAMA.KABUPATEN.KOTA))
plot.dki.histogram + geom_histogram(binwidth=10000)

Line Chart

Line chart atau grafik garis adalah tipe visualisasi yang sangat baik untuk menggambarkan pengaruh dari perubahan suatu variabel dari satu titik ke titik lain atau trend– dan variabel yang paling umum digunakan adalah waktu. Misal di bidang ekonomi untuk menggambarkan inflasi dari bulan ke bulan.

Untuk membuat line chart standar, kita gunakan geom bertipe “line” dan stat “identity”, yang bisa diwakili oleh function geom_line. Pada contoh berikut akan digunakan dataset tingkat inflasi bulanan tahun 2017 untuk negara Indonesia dan Singapura.

#membaca dataset inflasi dengan perintah read.csv.
inflasi.indo.sing <- read.csv("D:/LOOKER DAN R/modul R/data/inflasi.csv", sep=",")
head(inflasi.indo.sing)
##      Bulan    Negara Inflasi
## 1 Jan-2017 Indonesia  0.0349
## 2 Feb-2017 Indonesia  0.0383
## 3 Mar-2017 Indonesia  0.0361
## 4 Apr-2017 Indonesia  0.0417
## 5 May-2017 Indonesia  0.0433
## 6 Jun-2017 Indonesia  0.0437

Untuk membuat line chart dari data inflasi, berikut langkah-langkah dari ggplot2:

  • Membuat plot, dengan function ggplot()

  • Mengisi data dari pembacaan file sebelumnya

  • Membuat aesthetic mapping, dengan function aes

  • Menambahkan layer, dengan function geom_line()

plot.inflasi <- ggplot(data=inflasi.indo.sing, aes(x = Bulan,  y=Inflasi,  color=Negara))
plot.inflasi

#Menambahkan layer
plot.inflasi + geom_line()
## `geom_line()`: Each group consists of only one observation.
## ℹ Do you need to adjust the group aesthetic?

Perhatikan bahwa hasilnya error: tampilan grafik masih berupa plot kosong padahal sudah dilakukan layer (hasilnya tidak menampilkan grafik trend inflasi dari negara Indonesia dan Singapura).Penyebabnya adalah sistem kebingungan karena data untuk tiap bulan memiliki dua titik data. Tiap line perlu satu titik data untuk sumbu x dan y.

Oleh karena itu perlu membagi data dengan aesthetic grouping. Walaupun pada gambar sudah memiliki aesthetic color yang membagi Indonesia dan Singapura, tapi kita masih perlu melakukan aesthetic group sebagai berikut:

#Menggunakan Pengelompokan Data (grouping)
plot.inflasi <- ggplot(data=inflasi.indo.sing, aes(x = Bulan,  y=Inflasi,  color=Negara, group=Negara))
plot.inflasi + geom_line()

Hasilnya sudah menampilkan grafik trend inflasi dari negara Indonesia dan Singapura. Namun, `Bulan pada sumbuXmasih pada urutan yang salah. UrutanBulan` yang salah karena masalah pengurutan internal di sistem R, yang mengurutkan berdasarkan alphabet.

Kita dapat secara manual merubah urutan ini dengan factor dan parameter levels dimasukkan manual.

#Memperbaiki Urutan Bulan dengan Factoring
inflasi.indo.sing$Bulan <- factor(inflasi.indo.sing$Bulan, levels = c("Jan-2017", "Feb-2017", "Mar-2017", "Apr-2017", "May-2017", "Jun-2017", "Jul-2017", "Aug-2017", "Sep-2017", "Oct-2017"))
str(inflasi.indo.sing)
## 'data.frame':    20 obs. of  3 variables:
##  $ Bulan  : Factor w/ 10 levels "Jan-2017","Feb-2017",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ Negara : chr  "Indonesia" "Indonesia" "Indonesia" "Indonesia" ...
##  $ Inflasi: num  0.0349 0.0383 0.0361 0.0417 0.0433 0.0437 0.0388 0.0382 0.0372 0.0358 ...
#Plotting Ulang dengan hasil Factoring
#Tapi pada code ini juga ditambahkan layer geom_text 
#yang digunakan untuk menandai label-label nilai pada titik di line chart.
plot.inflasi <- ggplot(data=inflasi.indo.sing, aes(x = Bulan,  y=Inflasi,  color=Negara, group=Negara))
plot.inflasi + geom_line() + geom_text(aes(label=Inflasi),hjust=-0.2, vjust=-0.5)

Bar Chart

#membaca dataset dengan read.csv
penduduk<- read.csv("D:/LOOKER DAN R/modul R/data/datakependudukandki.csv", sep=",")
head(penduduk)
##   TAHUN        NAMA.PROVINSI NAMA.KABUPATEN.KOTA NAMA.KECAMATAN
## 1  2013 PROVINSI DKI JAKARTA       JAKARTA BARAT     CENGKARENG
## 2  2013 PROVINSI DKI JAKARTA       JAKARTA BARAT     CENGKARENG
## 3  2013 PROVINSI DKI JAKARTA       JAKARTA BARAT     CENGKARENG
## 4  2013 PROVINSI DKI JAKARTA       JAKARTA BARAT     CENGKARENG
## 5  2013 PROVINSI DKI JAKARTA       JAKARTA BARAT     CENGKARENG
## 6  2013 PROVINSI DKI JAKARTA       JAKARTA BARAT     CENGKARENG
##     NAMA.KELURAHAN LUAS.WILAYAH..KM2. KEPADATAN..JIWA.KM2. JENIS.KELAMIN
## 1 CENGKARENG BARAT               4.26                16409     Laki-laki
## 2 CENGKARENG BARAT               4.26                16409     Perempuan
## 3 CENGKARENG BARAT               4.26                16409     Laki-laki
## 4 CENGKARENG BARAT               4.26                16409     Perempuan
## 5 CENGKARENG BARAT               4.26                16409     Laki-laki
## 6 CENGKARENG BARAT               4.26                16409     Perempuan
##   RENTANG.UMUR JUMLAH
## 1        35-39   5316
## 2        35-39   3221
## 3        40-44   3137
## 4        40-44   6358
## 5        45-49   3675
## 6        45-49   3768
#Menghasilkan bar chart

#Membuat plot
plot.penduduk <- ggplot(data=penduduk, aes(x = NAMA.KABUPATEN.KOTA, y = JUMLAH))
#Menambahkan layer pada plot
plot.penduduk + geom_bar(stat = "identity")

#Aesthetic Fill dan Position Dodge
#Bagian plot
plot.penduduk <- ggplot(data=penduduk, aes(x = NAMA.KABUPATEN.KOTA, y=JUMLAH, fill=JENIS.KELAMIN))

#menambahkan layer pada plot
plot.penduduk + geom_bar(stat="identity", position="dodge")

#Melakukan agregasi
agregat.rata2<-aggregate(x=list(RATARATA=penduduk$JUMLAH), FUN=mean, by = list(NAMA.KABUPATEN.KOTA=penduduk$NAMA.KABUPATEN.KOTA, JENIS.KELAMIN=penduduk$JENIS.KELAMIN))
agregat.rata2
##    NAMA.KABUPATEN.KOTA JENIS.KELAMIN   RATARATA
## 1        JAKARTA BARAT     Laki-laki 2336.01389
## 2        JAKARTA PUSAT     Laki-laki  683.05556
## 3      JAKARTA SELATAN     Laki-laki  760.94359
## 4        JAKARTA TIMUR     Laki-laki  988.83932
## 5        JAKARTA UTARA     Laki-laki 3087.00358
## 6   KAB.ADM.KEP.SERIBU     Laki-laki   78.85185
## 7        JAKARTA BARAT     Perempuan 2259.58333
## 8        JAKARTA PUSAT     Perempuan  579.71212
## 9      JAKARTA SELATAN     Perempuan  740.14530
## 10       JAKARTA TIMUR     Perempuan  953.80513
## 11       JAKARTA UTARA     Perempuan 2990.49821
## 12  KAB.ADM.KEP.SERIBU     Perempuan   75.00000
agregat.jumlah<-aggregate(x=list(JUMLAH=penduduk$JUMLAH), FUN=sum, by = list(NAMA.KABUPATEN.KOTA=penduduk$NAMA.KABUPATEN.KOTA, JENIS.KELAMIN=penduduk$JENIS.KELAMIN))
agregat.jumlah
##    NAMA.KABUPATEN.KOTA JENIS.KELAMIN  JUMLAH
## 1        JAKARTA BARAT     Laki-laki 1177351
## 2        JAKARTA PUSAT     Laki-laki  270490
## 3      JAKARTA SELATAN     Laki-laki  445152
## 4        JAKARTA TIMUR     Laki-laki  578471
## 5        JAKARTA UTARA     Laki-laki  861274
## 6   KAB.ADM.KEP.SERIBU     Laki-laki    4258
## 7        JAKARTA BARAT     Perempuan 1138830
## 8        JAKARTA PUSAT     Perempuan  229566
## 9      JAKARTA SELATAN     Perempuan  432985
## 10       JAKARTA TIMUR     Perempuan  557976
## 11       JAKARTA UTARA     Perempuan  834349
## 12  KAB.ADM.KEP.SERIBU     Perempuan    4050
#"Merapikan" Tampilan Bar Chart
##Melakukan agregasi
p <- aggregate(x=list(JUMLAH=penduduk$JUMLAH), FUN=sum, by = list(NAMA.KABUPATEN.KOTA=penduduk$NAMA.KABUPATEN.KOTA, JENIS.KELAMIN=penduduk$JENIS.KELAMIN))

##Plot grafik
plot.penduduk <- ggplot(data=p, aes(x = NAMA.KABUPATEN.KOTA, y=JUMLAH, fill=JENIS.KELAMIN, label = JUMLAH)) + 
                 geom_bar(stat="identity", position="dodge")  +
                 labs(title="Jumlah Penduduk DKI Jakarta Umur > 35 - Tahun 2013", x="Kabupaten / Kota", y="Jumlah Penduduk")+ 
                 theme(axis.text.x = element_text(angle=45,vjust = 0.5), plot.title = element_text(hjust=0.5)) +
                 geom_text(position = position_dodge(1.2))
plot.penduduk
## Warning: `position_dodge()` requires non-overlapping x intervals

FACETING

Faceting pada ggplot2 adalah: Proses pembagian dataset menjadi potongan beberapa subset data dan menghasilkan visualisasi dari potongan-potongan tersebut dengan tujuan agar data lebih mudah dimengerti

#plot no faceting
plot.dki.NoFaceting <- ggplot(data=penduduk.dki, aes(x = LUAS.WILAYAH..KM2.,  y=KEPADATAN..JIWA.KM2.,  color=NAMA.KABUPATEN.KOTA))+layer(geom = "point", stat="identity", position = "identity")+ labs(x="Luas Wilayah (km2)", y="Kepadatan Jiwa (km2)", color="Kabupaten/Kota")
plot.dki.NoFaceting

#plot faceting
plot.dki.NoFaceting + facet_wrap( ~ NAMA.KABUPATEN.KOTA, ncol=2)