‘ggplot’ adalah sebuah package yg diciptakan sebagai small domain spesific language yg khusus digunakan untuk menciptakan plot. Idenya sama seperti dplyr yg diciptakan khusus untuk manipulasi data. Prinsip dari ggplot adalah didahului dengan menempatkan ‘canvas’ sebagai wadah atau dasar dari penempatan plot, yg kemudian diatas canvas tersebut, tiap elemen plot dikostumisasi layer demi layer. # Memulai ggplot2 Tahap pertama adalah dengan mengaktifkan packages ‘ggplot2’
library(ggplot2)
library(magrittr)
Tahap kedua adalah dengan memilih data. Untuk pembelajaran ini, akan kita pilih satu dataset yg sekiranya sesuai untuk menerapkan beberapa fungsi utama ggplot berdasarkan refrensi yg ada (“R for Data Science”)
data("mpg")
str(mpg)
## tibble [234 x 11] (S3: tbl_df/tbl/data.frame)
## $ manufacturer: chr [1:234] "audi" "audi" "audi" "audi" ...
## $ model : chr [1:234] "a4" "a4" "a4" "a4" ...
## $ displ : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
## $ year : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
## $ cyl : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
## $ trans : chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
## $ drv : chr [1:234] "f" "f" "f" "f" ...
## $ cty : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
## $ hwy : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
## $ fl : chr [1:234] "p" "p" "p" "p" ...
## $ class : chr [1:234] "compact" "compact" "compact" "compact" ...
head(mpg, 5)
## # A tibble: 5 x 11
## manufacturer model displ year cyl trans drv cty hwy fl class
## <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
## 1 audi a4 1.8 1999 4 auto(l5) f 18 29 p compa~
## 2 audi a4 1.8 1999 4 manual(m5) f 21 29 p compa~
## 3 audi a4 2 2008 4 manual(m6) f 20 31 p compa~
## 4 audi a4 2 2008 4 auto(av) f 21 30 p compa~
## 5 audi a4 2.8 1999 6 auto(l5) f 16 26 p compa~
Setelah menemukan data yg sesuai, percobaan pertama adalah dengan melakukan plot cepat dengan menggunakan salah satu bagian ggplot, yaitu fungsi qplot()
mpg %>% qplot(displ,hwy, data=.)
Lalu, kita coba membuat plot yg sama seperti di atas dengan menggunakan fungsi ggplot yg sebenarnya.
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))
Seperti contoh di atas, pada struktur generalnya, pembuatan ggplot adalah sebagai berikut :
ggplot(data = dataName) +
geom_function(mapping = aes(<mapping>))
dimulai dengan penulisan ggplot, diikuti argumen sumber data. Ini akan menjadi kanvas bagi plot. Jika kita berhenti di sini, kita akan mendapat plot kosong.
ggplot(data = mpg)
Setelah itu, akan ‘ditambahkan’ layer kedua, berupa fungsi geometri yg menentukan jenis plot atau grafik seperti apa yg kita inginkan. Masing-masing jenis grafik memiliki geom_function nya sendiri. Setiap
Aesthetic Mapping
fungsi ‘aesthetic’ yg mengikuti ‘mapping’ adalah properti visual dari objek di dalam plot. Properti-properti yg diatur di antara : * Ukuran * Bentuk * Warna titik data * dll yg menyangkut aspek visual plot data Sebagai contoh pada data mpg di atas, kita bisa menampilkan agar poin-poin scatter dibedakan warnanya berdasarkan jenis ‘class’.
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, col = class))
Sedikit berbeda dengan plot keluaraga plot() yg membutuhkan sedikit usaha ekstra untuk membeda warna di tiap data poin berdasarkan variabel ketiga, ggplot memungkinkan kita melakukan hal tersebut hanya dengan menambahkan arguman col = ‘nama_var’. Bahkan ggplot, secaara otomatis, membuatkan legenda.
Tidak hanya ‘col’, ggplot kita melakukan mapping dlam bentuk apapun hanya dengan menuliskan nama fungsi aesthetic yg diingkan di dalam aes(), dan dipasangkan dengan nama variabel yg dijadikan dasar nilai unik.
Satu logika yang perlu di pahami adalah saat kita menuliskan mapping menggunakan fungsi aes di dalam fungsi geom tertentu, maka pemetaan itu hanya berlaku untuk fungsi geom tersebut.
Ilustrasi :
ggplot(data) + geom_function(aes(x,y))
Pemeteaan x dan y di atas hanya berlaku untuk plot geom_function yg mendahuluinya. Sehingga, jika kita ingin mebuat plot yang memiliki lebih dari satu grafik, kita harus menuliskan mappingnya berulang. Jika kita tidak ingin repot, dan yakin bahwa mapping x dan y akan sama di seluruh plot, cukup tuliskan mapping x dan y pada fungsi ggplot().
ilustrasi :
ggplot(data, aes(x,y)) + geom_function1() + geom_function2()
Dalam penulisan ggplot, kita menggunakan tanda plus (+) untuk menyambungkan rangkaian fungsi geometri seperti kita menggunakan %>% dalam menyalurkan hasil fungsi.
**tanda ‘+’ dan ‘%>%’ Secara historis, sebenarnya kedua memiliki fungsi yang sama. Bahkan, jika pada saat pembangunan fungsi ggplot, tanda pipeline ‘+’ sudah banyak dikenal, mungkin ggplot juga akan menggunakannya.
Meski begitu, keduanya tetap memiliki fungsi dan karakter yg sedikit berbeda. Oleh karena itu, meskipun ingin digunakan bersmaan, %>% hanya bisa digunakan sekali, dan di awal code.
Ilustrasi :
cars %>% ggplot(aes(x,y)) + geom_function
Contoh :
cars %>% ggplot(aes(x = speed, y = ..count..)) +
geom_histogram(bins = 10)+
geom_density()
contoh 2 :
cars %>% ggplot(aes(x = speed, y = dist)) +
geom_point() + geom_smooth(method = "lm")
## `geom_smooth()` using formula 'y ~ x'
Dari dua contoh, kita tahu bahwa kunci untuk memahami ggplot ini adalah memahami geometrinya dan argumen-argumen khususnya, terutama argumen unik per geometri.
Selain menggunakan mapping yang sama (x dan y yg sama) untuk seluruh geometri,kita juga bisa membuat geometri dengan pasangan mapping yg berbeda untuk tiap plot.
Contoh 3 akan menunjukkan bahwa kita bisa membuat plot dengan dua grafik garis, satu garis adalah mapping variabel “year” sebagai x dengan variabel “unemployed” sebagai y, sementara satu garis lain masih menggunakan “year sebagai x namun dengan variabel”Armed.force" sebagai y.
data("longley")
longley %>% ggplot(aes(x = Year)) +
geom_line(aes(y= Unemployed)) +
geom_line(aes(y = Armed.Forces), col = "blue")
Ada beberapa hal yg bisa kita amati : pertama, kita menulis var x karena hanya variabel itu yg digunakan pada kedua geometric. Kedua, kita tidak menulis argumen ‘col’ di dalam aes di ‘geom_line()’ kedua membuat pewarnaan biru pada garis kedua tidak tergantung pada variabel lainnya dalam data.
contoh 4 jika fungsi ‘col’ ditulis dalam ‘aes’ ‘geom_line’ kedua:
longley %>% ggplot(aes(x = Year)) +
geom_line(aes(y= Unemployed)) +
geom_line(aes(y = Armed.Forces, col = "blue"))
Seperti yg ditunjukan pada contoh 4, penulisan fungsi ‘col’ di dalam ‘aes’ ‘geom_line’ kedua tidak akan merubah warna garis jadi biru. Untuk membuatnya jadi warna biru, kita juga harus memspesifikasi fungsi ‘col’ pada ‘geom_line’ pertama.
Tidak hanya ‘col’, kondisi ini juga berlaku untuk seluruh argumen aesthetic lainnya (bentuk, ukuran, dll).
Selain itu, hal lain yg bisa kita amati adalah : Karena pada contoh 3 dan 4 kita lebih pada ‘modifikasi’ plot, bukan menggambar plot di canvas geom_line kedua, fitur ggplot membuat sumbu-y secara otomatis mengatus kedua plot agar fit dalam satu sumbu-y, tanpa perlu mengatur fungsi limit sumbu y.
Contoh 5.1 Penggunaan selain ‘color’ dalam aes
data("mpg")
mpg %>% ggplot() +
geom_point(aes(x = displ, y = hwy, size = class))
## Warning: Using size for a discrete variable is not advised.
contoh 5.2
mpg %>% ggplot() +
geom_point(aes(x = displ, y = hwy, alpha = class))
## Warning: Using alpha for a discrete variable is not advised.
Note : argument alpha digunakan untuk mengatur transparasi objek
contoh 5.3
mpg %>% ggplot() +
geom_point(aes(x = displ, y = hwy, shape = class))
## Warning: The shape palette can deal with a maximum of 6 discrete values because
## more than 6 becomes difficult to discriminate; you have 7. Consider
## specifying shapes manually if you must have them.
## Warning: Removed 62 rows containing missing values (geom_point).
Note : argument ‘shape’ mengatur bentuk dari objek visual data WARNING : saat menggunakan ‘shape’ hanya akan ada 6 klasifikasi yg digunakan. Secara default, di luar 6 itu akan tidak ditunjukkan.
Note penting : dari beragam contoh ini, bisa diambil pelajaran bahwa ggplot akan memperlakukan x dan y serta penempatannya secara visual sebagai bagian dari aesthetic plot atau properti visual plot yg dapat kita atur sesukanya.
Contoh 5.4 Penggunaan logika aritmatika dalam ggplot aesthetic
mpg %>% ggplot() +
geom_point(aes(x = displ, y = hwy, col = displ < 5))
## Facet Facet adalah subplot yg menunjukkan masing-masing anggota dari subplot. Maksudnya, misal, jika kita punya satu variabel berisi nilai kontinu, dan satu variabel berisiri nilai kategorikal. Kita bisa saja memplotnya dalam satu grafik, namun terkadang akan lebih berguna jika kita menunjukkan pola data nilai kontinu yg ada berdasarkan kategori data yg ada. Facet akan membantu kita untuk membentuk grafik dari sub plot tersebut.
Karena contoh terbaiknya adalah menggunakan data kategorikal, maka pertama kita harus tentukana mada dari dataset mpg yg merupakan kategorikal.
str(mpg)
## tibble [234 x 11] (S3: tbl_df/tbl/data.frame)
## $ manufacturer: chr [1:234] "audi" "audi" "audi" "audi" ...
## $ model : chr [1:234] "a4" "a4" "a4" "a4" ...
## $ displ : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
## $ year : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
## $ cyl : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
## $ trans : chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
## $ drv : chr [1:234] "f" "f" "f" "f" ...
## $ cty : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
## $ hwy : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
## $ fl : chr [1:234] "p" "p" "p" "p" ...
## $ class : chr [1:234] "compact" "compact" "compact" "compact" ...
# Dari sini kita pilih saja var class, cyl, dan drv untuk diubah
newMpg <- mpg
newMpg$drv <- as.factor(newMpg$drv)
newMpg$cyl <- as.factor(newMpg$cyl)
newMpg$class <- as.factor(newMpg$class)
# Tes newMpg
str(newMpg)
## tibble [234 x 11] (S3: tbl_df/tbl/data.frame)
## $ manufacturer: chr [1:234] "audi" "audi" "audi" "audi" ...
## $ model : chr [1:234] "a4" "a4" "a4" "a4" ...
## $ displ : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
## $ year : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
## $ cyl : Factor w/ 4 levels "4","5","6","8": 1 1 1 1 3 3 3 1 1 1 ...
## $ trans : chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
## $ drv : Factor w/ 3 levels "4","f","r": 2 2 2 2 2 2 2 1 1 1 ...
## $ cty : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
## $ hwy : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
## $ fl : chr [1:234] "p" "p" "p" "p" ...
## $ class : Factor w/ 7 levels "2seater","compact",..: 2 2 2 2 2 2 2 2 2 2 ...
Setelah perubahan type data, kita mulai lakukan facet. Secara umum, facet bisa dilakukan secara tunggal, maupun dengan kombinasi variabel. Untuk facet berdasar variabel tunggal, kita gunakan fungsi :
facet_wrap(~var, nrow)
Untuk facet berdasar kombinasi variabel :
facet_grid(var1 ~ var2)
Contoh 6.1 facet_wrap
newMpg %>% ggplot(aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~class, nrow =2)
contoh 6.2 facet_grid
newMpg %>% ggplot(aes(x = displ, y = hwy)) +
geom_point() +
facet_grid(drv~cyl)
contoh 6.2.1 facet grid bukan dimensi kolom dan baris
newMpg %>% ggplot(aes(x = displ, y = hwy)) +
geom_point() +
facet_grid(.~cyl)
Menggunakan .~ di atas contoh 6.2.1, kita mengklasifikasikan hanya menampilkan klasifikasi secara kolom berdasarkan cyl. Kenapa? karena ‘.’ berfungsi untuk menahan display dari dimensi baris (row) dan hanya menampilkan dimensi kolom.
Bagaimana kalau drv~.?
newMpg %>% ggplot(aes(x = displ, y = hwy)) +
geom_point() +
facet_grid(drv~.)
Seperti yg kita, lihat, kalau posisi facet_grid dibalik menjadi var~. (‘.’ di belakang), hanya dimensi baris yg ditampilkan.
Pada pembahasan sebelumnya, kita bisa memahami posisi ‘geom_function’ sebagai komponen layer penting dalam visualisasi ggplot. Secara definisi, ‘geom’ adalah objek geometrikal yang diplot untuk mempresentasikan data.
Terdapat banyak geom_function yg tersedia dalam packages ggplot2. Untuk lebih ringkasnya, bisa klik cheatsheet berikut : geom_cheatsheet
Apa itu statistical transformation? Dari pembahasan sebelumnya, kita banyak menggunakan geometri poin (scatter plot), line dan smooth. Jika kita perhatikan, selain tampilan fisik, apa yg membedakan diantara ketiga plot tersebut? Dalam poin dan line, kita tahu bahwa grafik yg dibangun menggunakan nilai-nilai data yg ‘apa adanya’ dari data set untuk menyusun dan menampilkan visual grafik. Namun pada geom_smooth, dari mana garis tersebut disusun? jawabannya adalah dari hasil model fit dan prediksi serta varian error data, YANG TIDAK ADA DI DATA MENTAH. Jadi, dalam pembangunan plot, terdapat dua jenis: satu yang menampilkan visual berdasarkan data apa adanya, dan plot yg dibangun setelah melalui suatu proses pengolahan statistik yg berjalan di belakang layar. Contoh lain selain smooth adalah plot bar, plot boxplot, histogram, polygon, serta beberapa plot lainnya. Plot-plot ini membangun visual mereka setelah mengolah data mentah yg ada, inilah yg disebut statistical transformation dalam ggplot, atau yg diatur dalam argumen ‘stat’.
Kita bahas singkat di sini. Ada beberapa fungsi koor : * coord_flip() –> untuk membalikkan sumbu * coord_quickmap()—> pelajari lagi soal analisa data geografi * coord_polar() —> Membentuk grafik seperti ‘pie’ (tapi bukan pie)