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 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
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>
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 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 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 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)
#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 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)