Pemrograman Grafik

Pengantar

R umumya digunakan untuk analisis statistika formal, seperti pengujian, pemodelan, atau pun deskriptif. Namun selain untuk analisis tersebut, R juga dapat digunakan untuk membuat grafik. R menyajikan berbagai macam standar plot statistika termasuk scatterplot, boxplot, histograms, barplot, pie chart, dan basic 3D plots. Package standar grafik di dalam R adalah graphics. Package tersebut sudah tersedia sewaktu instalasi R dan otomatis sudah diload, sehingga fungsi di dalam package tersebut bisa langsung digunakan. Terdapat package grafik lain juga seperti lattice, grid, dan ggplot2. Fungsi yang ada di package graphics tidak bisa digunakan di ggplot2. Yang bisa sama sama digunakan adalah media/ devicesnya. Tetapi, jika media sudah diisi dengan fungsi di ggplot2 tidak bisa ditambahkan dengan fungsi-fungsi yang ada di package graphics. Devices adalah tempat gambar akan dibuat. Kita dapat menyiapkan devices lebih dari satu, namun yang aktif hanya satu.

Beberapa fungsi dalam devices

  • Untuk melihat daftar devices yang sudah dibuat dev.list()
  • Melihat devices yang sedang aktif dev.cur()
  • Mengganti devices yang aktif dev.set(i) diperlukan argumen nama atau pun index ke berapa. Device selain yang berbasis window isinya tidak bisa diakses kalau isinya belum ditutup
  • Menutup device yang aktif dev.off()
  • Menutup semua device graphics.off()
  • Meng-copy isi dari device dev.copy() kemudian tuliskan tujuan peng-copy-an kemana

Package Grafik Dasar

Package grafis dasar secara otomatis sudah ada di R base. Perintah dasar grafik pada package ini adalah plot, dan plot ini harus disimpan pada suatu media. Di dalam fungsi plot terdapat lebih dari satu argumen. Argumen yang utama dalam plot ini adalah mengenai grafik apa yang akan dibuat. Grafik ini default-nya adalah untuk scatter plot.

General form: plot(x,y, …)

Ilustrasi pembuatan plot

x <- rnorm(10) #objek x vektor acak sebaran normal sebanyak 10
y <- rnorm(10) #objek y vektor acak sebaran normal sebanyak 10
plot(x,y) #dibuatkan di dalam devices, kalau tidak disiapkan akan memanggil default, kemudian membuat scatter plot dari x dan y secara berpasangan. akan ada sebanyak 10 titik.

type pada plot

Defaultnya adalah tipe titik/ point, namun dapat diganti dengan beberapa tipe yang tersedia

  • type= 'p' titik, ini adalah tipe default.
  • type= 'l' garis, menghubungkan titik.
  • type= 'b' keduanya (garis dan titik) antara garis dan titik dipisahkan.
  • type= 'c' seperti ‘b’ tapi garisnya tidak over-laped.
  • type= 'o' keduanya (garis dan titik) overlaid, garis dan titik tersambung.
  • type= 'n' nothing, tidak ada gambar, plot kosong, menyiapkan plot/ devices saja, tapi isinya kosong. Tujuannya misalkan kalau membuat grafik dengan banyak pengulangan, dan dilakukan secara otomatis, langkah pertama siapkan dulu plotnya dengan tipe nothing, baru gunakan fungsi fungsi lain.
  • type= 's' (s kecil), tangga, segmen pertama horizontal. Pada tipe ini akan dibuat dengan menarik garis secara horizontal pada segmen pertama, kemudian membuat fungsi tangga.
  • type= 'S' (S besar), tangga, segmen pertama vertikal .
  • type= 'h' garis vertikal dari sumbu-x ke titik.

Ilustrasi membuat plot dengan beberapa tipe.

x1 <-1:40
y1 <- rnorm(40, 5, 1) # membangkitkan bilangan normal sebanyak 40 dengan nilai tengah 5 dan simpangan baku 1

Membuat plot type p

plot(x1,y1, type='p')

Membuat plot type o

plot(x1,y1, type='o')

Membuat plot type n

plot(x1,y1, type='n')

Karakter Tipe Titik

Pilihan karakter untuk tipe plot yang ada titiknya misalkan tipe p, tipe b, tipe o adalah dengan menggunakan fungsi pch dan cex. pch mengubah point dari character, mengubah berdasarkan di keyboard. Secara default pch terdiri dari 25 karakter, dan dapat juga untuk dicustom. cex berhubungan dengan ukuran perbesar atau perkecil. Defaultnya =1, jika terasa terlalu besar bisa dikecilkan dengan memasukkan angka <1 dan bilangan positif. Kalau memperbesar gunakan >1.

Menggunakan fungsi pch

Cara 1

plot(x,y, pch='*')

Cara 2 diisi dengan angka dari 1 - 25

plot(x,y, pch=19) #pch =19 adalah bulatan isi

Menggunakan fungsi cex

plot(x,y, pch=19, cex=3) #pch =19 adalah bulatan isi

Karakter Tipe Garis

Pilihan garis untuk plot tipe garis, misalkan tipe l dapat menggunakan fungsi lty dan lwd. lty (line type) dapat digunakan untuk mengganti tipe garis. Dapat diisi dengan suatu angka integer (1,2,dll). Defaultnya adalah 1= solid, 2= small breaks, dll. lwd (line width) adalah fungsi yang mengatur ketebalan dari garis.

Menggunakan fungsi lty

plot(x=1:10, y, type="l", lty=1)

Menggunakan fungsi lwd

plot(x=1:10, y, type="l", lty=2, lwd=2)

Sumbu pada Grafik

  • axes bernilai boolean/ logic TRUE dan FALSE. Defaultnya adalah T, secara default kita akan menggambarkan sumbu dari axesnya X dan Y. Jika kita isikan axes= F maka sumbunya tidak akan digambarkan.
  • xlim dan ylim merupakan batas x dan y. Mengatur skala yang ada di grafik. Defaultnya akan diatur oleh data kita, jadi akan menghitung x dan y-nya dari data kita berapa. Misalkan xlim=c(0,10) sumbu x akan disiapkan dari 0 sampe 10. Defaultnya menghitung minimum dan maximum dari data kita, itu yang digunakan untuk batas sumbu x dan y kita.
  • untuk menambakan axis sesuai keinginan kita. misalkan data kita tulisannya januari feb dst, padahal terurutkan dalam huruf, bisa menggunakan axis(1, c(1,2,5,10)) angka 1 menyatakan sumbu x di bawah, di dalam c berarti tic marknya akan dituliskan di mana.
  • box untuk membuat kota axis
  • title menambahkan label

Warna Grafik

warna default dari grafik adalah hitam. Fungsi col atau color, dapat digunakan untuk mengubah warna default. Paling sederhana, warna tersebut dapat diganti dengan memasukkan numeric 1-8 (recycle), misalkan col=4. Hanya ada 8 warna yang secara visual bisa dibedakan. Selain dengan numeric, dapat juga digunakan nama warna dalam bahasa inggris col="red". Daftar warna dapat dilihat dengan menggunakan fungsi colors(). Untuk memberikan warna juga dapat menggunakan fungsi rgb(), rainbow() (warna gradasi, dll. Package lain untuk memberikan warna adalah colorspace, colourpicker, RColorBrewer, dll

Melihat warna yang ada pada fungsi colors()

colors()
 [1] "white"          "aliceblue"      "antiquewhite"   "antiquewhite1" 
 [5] "antiquewhite2"  "antiquewhite3"  "antiquewhite4"  "aquamarine"    
 [9] "aquamarine1"    "aquamarine2"    "aquamarine3"    "aquamarine4"   
[13] "azure"          "azure1"         "azure2"         "azure3"        
[17] "azure4"         "beige"          "bisque"         "bisque1"       
[21] "bisque2"        "bisque3"        "bisque4"        "black"         
[25] "blanchedalmond" "blue"           "blue1"          "blue2"         
[29] "blue3"          "blue4"          "blueviolet"     "brown"         
[33] "brown1"         "brown2"         "brown3"         "brown4"        
[37] "burlywood"      "burlywood1"     "burlywood2"     "burlywood3"    
[41] "burlywood4"     "cadetblue"      "cadetblue1"     "cadetblue2"    
[45] "cadetblue3"     "cadetblue4"     "chartreuse"     "chartreuse1"   
[49] "chartreuse2"    "chartreuse3"    "chartreuse4"    "chocolate"     
[53] "chocolate1"     "chocolate2"     "chocolate3"     "chocolate4"    
[57] "coral"          "coral1"         "coral2"         "coral3"        
[61] "coral4"         "cornflowerblue" "cornsilk"       "cornsilk1"     
[65] "cornsilk2"      "cornsilk3"      "cornsilk4"      "cyan"          
[69] "cyan1"          "cyan2"          "cyan3"          "cyan4"         
[73] "darkblue"       "darkcyan"       "darkgoldenrod" 
 [ reached getOption("max.print") -- omitted 582 entries ]

Fungsi rainbow() untuk mebentuk gradasi warna

rainbow(7)
[1] "#FF0000" "#FFDB00" "#49FF00" "#00FF92" "#0092FF" "#4900FF" "#FF00DB"

Fungsi rgb() untuk Intensity red green blue, outputnya kode hexacodenya

rgb(0.30, 0.20, 0.70)
[1] "#4D33B3"

Membuat plot dengan memberikan warna menggunakan fungsi col()

plot(x=1:10, y, type="l", lty=2, lwd=2, col="red")

Membuat plot dengan memberikan warna menggunakan fungsi rgb()

plot(x=1:10, y, type="l", lty=2, lwd=2, col=rgb(0.1,0.7,0.88))

Label pada Grafik

Pilihan pelabelan pada grafik:

  • main label pada judul utama paling atas
  • sub label pada sub judul paling bawah
  • xlab label pada sumbu x
  • ylab label pada sumbu y
plot(x1,y1,type="p",xlab="Sumbu x",ylab="Sumbu y",
     main="Bilangan Acak Normal",col=2,pch=16)

Fungsi-fungsi grafik lain

Fungsi plot digunakan hanya satu kali, jika digunakan lagi, grafik sebelumnya akan dihapus. Jika ingin menambahkan sesuatu pada grafik yang sudah ada, maka digunakan fungsi-fungsi:

  • points(x,y) sama dengan plot, bedanya tipe defaultnya adalah karakter atau tipe p
  • lines(x,y menambah tipe garis
  • ablines(a,b) membuat garis fungsi y=a+bx,
  • abline(h=y) y nya adlah vektor numerik, maka akan membuat garis horizontal dari titik yang ada di y
  • abline(v=x) secara vertikal, hanya garis lurus saja.
  • segments menambahkan garis lurus dari titik
  • arrows
  • poligons(x,y) membuat poligon dari titik terakhir ditarik lagi ke titik pertama
  • text(x,y, teks) di dalam grafik
  • mtext di luar grafik, menuliskan label pada judul dan garis sumbu
f <- function(x) cumsum(x)
x <- 1:20
y <- f(x)
plot(x,y,xlab= "",ylab= "")
mtext("Plotting the expression",side=3,line=2.5)

# simbol yang dapat diguanakan di expression
mtext(expression(y[i]== sum(x[j],j==1,i)),side=3,line=0)
mtext("The first variable",side=1,line=3)
mtext("The second variable",side=2,line=3)

plot(x1,y1,type="p",xlab="Sumbu x",ylab="Sumbu y",main="Bilangan Acak Normal",col=rainbow(40),
pch=16,
cex=2,
xlim=c(0,50), # xilim diubah dari 0 sampai 50, x-nya diubah dari 
ylim=c(2.5,7.5))

## Menambahkan titik
x2 <- 41:50
y2 <- rnorm(10,5,1)
points(x2,y2,cex=2)
# Menambahkan Garis
x3 <- rep(40.5,20)
y3 <- seq(min(c(y,y1)),max(c(y,y1)),length=20)
lines(x3,y3,col=4,lwd=2,lty=2)
abline(h=mean(y),col="red",lwd=2.5)
abline(a=2,b=1/10,col="maroon3",lwd=2,lty=2)
#menambahkan tanda panah
# koordinat awal dan akhir harus didefinisikan di x0 dan y0
arrows(x0=30,y0=3.5,x1=40,y1=mean(y)-.1,lwd=2)
#menambahkan tulisan dengan text
text(x=29,y=3.3,labels="Titik potong",cex=0.7)
text(x=3,y=7.3,labels="Data awal",cex=0.7)
text(x=46,y=7.3,labels="Data baru",cex=0.7)

Parameter Grafik

Parameter- parameter dari grafik dapat disetting ulang melalui fungsi grafiknya (plot) atau melalui fungsi par(). Pilihan yang dikontrol oleh fungsi par():

  • text and symbols: adj, ann, cex, crt, exp, font, mex, mkh, pch, ps, smo, srt
  • plot area: bty, new, pin, plt, pty, uin, usr, xpd
  • axes and tickmarks: exp, lab, las, mgp, tck, xaxo, xaxs, xaxt, yaxp, yaxs, yaxt
  • margins: mai, mar, mex, oma, omd, omi
  • figure and page areas: fig, fin, fty, mfg, mfcol, mfrow, oma, omd, omi
  • color: bg, col, fg, gamma
  • misc: ask, col, err, lty, lwd
  • information: lem, acc, cin, cra, csi, cxy, dev, cin, frm, omo, rsz, tsp, uin

Misal diinginkan mengubah 1 device dapat menampung 6 grafik dalam format 3x2

tmp <- par (mfrow=c(1,2))#megubah device menjadi 1x2
x <- rnorm(10) #objek x vektor acak sebaran normal sebanyak 10
y <- rnorm(10) #objek y vektor acak sebaran normal sebanyak 10
plot(x,y)
plot(y,x)

Untuk mengembalikan ke default menggunakan perintah

par(tmp)

Menggambar banyak grafik dalam satu device

sewaktu membuat grafik ada beberapa nilai yang sudah disimpan dalam nilai default dan disimpan di dalam fungsi par. Kadang kita ingin membuat beberapa grafik yang disimpan dalam satu device. Misal ingin membuat 6 grafik dalam 1 devices. Terdapat 3 cara untuk menampilkan beberapa grafik dalam satu devices:

  • Mengubah setting parameter, parameter yang diubah mfrow atau mfcol
    Sebagai contoh syntax yang dapat digunakan adalah par(mfrow=c(2,2)) akan mengubah layout menjadi 2x2. Setting margin seperti mar untuk meningkatkan/ menurunkan ruang sekeliling plot dan oma untuk meningkatkan/ menurunkan ruang antara matriks plot par(mfrow=c(1,1)) mengembalikan ke layout default.
x <- rnorm(10)
y<- rnorm (10)
tmp <- par(mfrow=c(2,2))
plot(x=1:10,x)
plot(x=1:10,y)
boxplot(x)
boxplot(y)

par(tmp)
  • Split screen dengan fungsi split.screen()

split.screen(c(2,2)) fungsi ini akan seperti par(mfrow=c(2,2)). Untuk berpindah antar area plot menggunakan fungsi screen(i). Untuk mengembalikan ke default menggunakan fungsi close.screen(all=T).

split.screen(c(2,2))
[1] 1 2 3 4
screen(1)
plot(x=1:10,x)
screen(2)
plot(x=1:10,y)
screen(3)
boxplot(x)
screen(4)
boxplot(y)

#close.screen(all=TRUE)
  • Fungsi layout
    Dengan fungsi layout() ukuran grafiknya lebih fleksibel (bervariasi) dibandingkan dengan setting parameter atau fungsi split.screen(). Langkah pertama adalah membuat matriks rancangan dengan nilai integer positif (untuk area grafik) dan 0 untuk area kosong. Misalkan akan digambar 4 grafik dengan area: Grafik 1 berukuran 1x1. Grafik 2 berukuran 1x1. Grafik 3 berukuran 1x2. Grafik 4 berukuran 1x2.
rancangan <- matrix(c(1,1,3,1,1,3,2,2,4,2,2,4),
                    nrow=3)
obj <- layout(rancangan)
layout.show(obj)

plot(x=1:10,x)
plot(x=1:10,y)
boxplot(x,horizontal=TRUE)
boxplot(y,horizontal=TRUE)

Package Grafik Berbasis Grammar

Package yang digunakan adalah ggplot2, dan package ini harus diinstall terlebih dahulu. Terdapat 4 komponen grammar

  • geom geometrik, bentuk data yang diinginkan, bar, point, line, ribbon, text
  • aesthetic mengatur bagaimana geom ditampilkan x position, y position, color, fill, shape, size
  • stat data yang mau ditampilkan apa, apakah data aslinya misal point, atau banyak bar misalkan dalam histogram.
  • scale konversi dari raw data.

Package ggplot2 menyediakan 2 fungsi untuk membuat grammar graphics yaitu qplot() dan ggplot(). qplot() menggunakan sebagian dari fungsi grammar grafik, untuk grafik umum dapat digunakan.

qplot

Ilustrasi qplot untuk satu data kategorik, secara otomatis membuat bar chart dari factor.

library(ggplot2)
qplot(factor(gear),data=mtcars)

Ilustrasi qplot untuk peubah numerik. Ketika dibeli objek numerik otomatis dibentuk menjadi histogram.

dtx <- data.frame(x=rnorm(100))
qplot(x,data=dtx)

Ilustrasi qplot untuk dua peubah kategorik. Meskipun grafik yang dihasilkan menjadi tidak bermanfaat.

qplot(factor(gear), factor(cyl), data=mtcars)

Ilustrasi qplot untuk dua peubah numerik

qplot(mpg, wt, data =mtcars)

Ilustrasi qplot untuk dua peubah, kategorik dan numerik

qplot(factor(cyl), wt, data =mtcars,geom= c("boxplot", "jitter"))

ggplot

Perbedaan ggplot dengan qplot adalah, jika qplot langsung menampilkan grafik, maka ggplot akan membuat objek grafiknya terlebih dahulu baru ditampilkan. Untuk menampilkannya dengan menambahkan layer. Grafik dalam ggplot menggunakan layer-layer. Menambahan layer dapat menggunakan fungsi layer, stat, atau geom. Komponen geom adalah layer untuk bentuk grafik, sedangkan komponen stat adalah layer untuk data yang ditampilkan. Kita dapat menggunakan salah satunya. geom dan stat umumnya memiliki default berpasangan, tetapi ada beberapa geom dan stat yang defaultnya berbeda. Untuk dapat mengakses komponen pada geom dapat menggunakan perintah apropos("^geom_"). Untuk dapat mengakses komponen pada stat dapat menggunakan perintah apropos("^stat_")

Akses komponen pada geom

apropos("^geom_")
 [1] "geom_abline"            "geom_area"              "geom_bar"              
 [4] "geom_bin2d"             "geom_blank"             "geom_boxplot"          
 [7] "geom_col"               "geom_contour"           "geom_contour_filled"   
[10] "geom_count"             "geom_crossbar"          "geom_curve"            
[13] "geom_density"           "geom_density_2d"        "geom_density_2d_filled"
[16] "geom_density2d"         "geom_density2d_filled"  "geom_dotplot"          
[19] "geom_errorbar"          "geom_errorbarh"         "geom_freqpoly"         
[22] "geom_function"          "geom_hex"               "geom_histogram"        
[25] "geom_hline"             "geom_jitter"            "geom_label"            
[28] "geom_line"              "geom_linerange"         "geom_map"              
[31] "geom_path"              "geom_point"             "geom_pointrange"       
[34] "geom_polygon"           "geom_qq"                "geom_qq_line"          
[37] "geom_quantile"          "geom_raster"            "geom_rect"             
[40] "geom_ribbon"            "geom_rug"               "geom_segment"          
[43] "geom_sf"                "geom_sf_label"          "geom_sf_text"          
[46] "geom_smooth"            "geom_spoke"             "geom_step"             
[49] "geom_text"              "geom_tile"              "geom_violin"           
[52] "geom_vline"            

Akses komponen pada stat

apropos("^stat_")
 [1] "stat_bin"               "stat_bin_2d"            "stat_bin_hex"          
 [4] "stat_bin2d"             "stat_binhex"            "stat_boxplot"          
 [7] "stat_contour"           "stat_contour_filled"    "stat_count"            
[10] "stat_density"           "stat_density_2d"        "stat_density_2d_filled"
[13] "stat_density2d"         "stat_density2d_filled"  "stat_ecdf"             
[16] "stat_ellipse"           "stat_function"          "stat_identity"         
[19] "stat_qq"                "stat_qq_line"           "stat_quantile"         
[22] "stat_sf"                "stat_sf_coordinates"    "stat_smooth"           
[25] "stat_spoke"             "stat_sum"               "stat_summary"          
[28] "stat_summary_2d"        "stat_summary_bin"       "stat_summary_hex"      
[31] "stat_summary2d"         "stat_unique"            "stat_ydensity"         
ggplot(mpg,aes(displ,hwy)) +# membuat objek
geom_point()  # menambahkan layer dengan fungsi geom

ggplot(mpg,aes(displ,hwy))+
  layer(geom= "point",stat = "identity",position= "identity",params= list(na.rm =FALSE))

komponen geom bentuk grafik dan stat data yang ditampilkan.

Menyimpan Grafik
menggunakan fungsi ggsave() yang akan diperiksa akhiran filenya. jika akhiran file JPEG maka otomatis menggunakan akhir JPEG.

Latihan

plot(sin,-pi, 2*pi)

plot(table(rpois(100,5)),type="h",col="red",
lwd=1,main="rpois(100,lambda=5)")

a1 <- 1:25
a2 <- rnorm(25,4,2)
plot(a1,a2,pch="w",main="W")

plot(a1,a2,type="n",main="W")
text(a1,a2,labels=paste("w",1:25,sep=""),col=rainbow(25),cex=0.8)

x <- rchisq(100,df=4)
hist(x,freq=FALSE,ylim=c(0,0.2))
curve(dchisq(x,df=4),col=2,lty=2,lwd=2,add=TRUE)

Pemecahan Canvas

par(mfrow=c(2,2))
plot(1:40,y=rnorm(40),type="p",xlab="Sumbu x",ylab="Sumbu y",
main="Bilangan Acak Normal",col=2,pch=16)
plot(sin,-pi, 2*pi)
plot(table(rpois(100,5)),type="h",col="red",
lwd=1,main="rpois(100,lambda=5)")
plot(a1,a2,type="n",main="W")
text(a1,a2,labels=paste("w",1:25,sep=""),
col=rainbow(25),cex=0.8)

par(mfcol=c(2,2))
plot(1:40,y=rnorm(40),type="p",xlab="Sumbu x",ylab="Sumbu y",
main="Bilangan Acak Normal",col=2,pch=16)
plot(sin,-pi, 2*pi)
plot(table(rpois(100,5)),type="h",col="red",lwd=1,
main="rpois(100,lambda=5)")
plot(a1,a2,type="n",main="W")
text(a1,a2,labels=paste("w",1:25,sep=""),
col=rainbow(25),cex=0.8)

#windows()
yb <- rnorm(100,5,1)
split.screen(c(2,2)) #split screen 2x2
[1] 5 6 7 8
# dapat memilih screen untuk ditampilkan terlebih dahulu
screen(3)
boxplot(yb)
title("Boxplot Bilangan Acak Normal",cex.main=0.7)
screen(4)
xb <- 1:100
plot(xb,yb,type="l",lwd=2,col="blue")
title("Line Plot Bilangan Acak Normal",cex.main=0.7)
screen(2)
hist(yb,freq=FALSE,main=NULL,ylim=c(0,0.5))
x <- yb
curve(dnorm(x,5,1),col="red",lty=2,lwd=2,add=TRUE)
title("Histogram Bilangan Acak Normal",cex.main=0.7)
screen(1)
plot(xb,yb,pch=16,col=rainbow(100))
title("Scatter Plot Bilangan Acak Normal",cex.main=0.7)

Referensi

Raharjo, Mulianto. (3 Maret 2021). STA561 Pemrograman Statistika: Grafik. Retrieved from https://newlms.ipb.ac.id/

Soleh, A.M. (2021). STA561 Pemrograman Statistika: Pemrograman Grafik. Retrieved from https://newlms.ipb.ac.id/

https://www.stat.auckland.ac.nz/~paul/RGraphics/chapter1.pdf