課堂講義請參考:R Graphics with Ggplot2 - Day1
想要更深入的可以參考這個網站:R for Data Science
好了,開始吧!
首先,你需要先安裝這幾個 packages 和檔案庫(dataset):
library(ggplot2) library(MASS) data(mpg) data(economics) |
檔案 mpg 裡面有幾個 variables: cty, cyl, displ, hwy, drv
可以用 class() 去看各個的型態
class(mpg$cty) >[1] "integer" class(mpg$displ) >[1] "numeric" class(mpg$drv) >[1] "character" class(mpg$class) >[1] "function" |
也可以用 levels() 查看各個的 level
levels(mpg$drv) >NULL levels(factor(mpg$drv)) >[1] "4" "f" "r" levels(factor(mpg$cyl)) >[1] "4" "5" "6" "8" |
因為 drv 和 cyl 不是 factor,所以顯示 NULL,但可以把它們設成 factor,於是 cyl 的四個整數就不再是數字。設成 factor 的原因之後會講到。
基本句法是:ggplot(data, aes(x, y)) + geom
data 是你想處理的檔案,在這裡是 mpg。
aes() 裡面是你要的 X-axis 和 Y-axis 參數,例如 drv。
可以把前面的 ggplot(data, aes()) 指定為一個 object,後面再加各種圖顯示看看,這樣就不用每次都要重複。例如:
p <- ggplot(mpg, aes(cyl, displ)) p + geom_point() |
可以查看 p 是什麼型態
class(p) >[1] "gg" "ggplot" |
可以把圖存成 pdf 檔案
ggsave("file_name")
1. 點圖:geom_point()
即 Excel 中的 scatter plot,常見的點圖。
ggplot(mpg, aes(x = hwy, y = cty)) + geom_point()
可以把 x = 和 y = 省略,變成:ggplot(mpg, aes(hwy, cty) + geom_point()
可以把點設成有顏色的,放在 aes() 裡面就可以: colour =
如果想要依照 class 的類別設顏色的話,就是 colour = class。
ggplot(mpg, aes(hwy, cty, colour = class)) + geom_point() |
如果 variables 的型態是 factor 或 text 的話,每個參數會有不同的顏色。
例如:drv = "character",或是 class = "function"。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-N04mUExrFy1eqUQ95J0p2EV3AN5tmK0MKgunzc4ufGsu0jaSzHXMs9G8_57P-vq3LL1ZyzDiM-N3tOi0nnh-WQtWBk7tGqJJ7J1ZNaQmCy4EO2VfvgrD1eUNXwkj65DBgA-iljCexVg/s1600/Point+1_x-hwy+y-cty_color-class.png)
在 variables 的原本型態不是 factor 或 text 的情況下(通常是數字,包括 integer 和 numeric),會把數字以漸層的顏色顯示。例如:cyl = "integer"。
ggplot(mpg, aes(hwy, cty, colour = cyl)) + geom_point() |
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgS6qGCkGWPa9A6SP4vH3p1nAr7azw-_Ew1aOAi_jFRGSZXkbYi4uvQNzT-xuCVk7QMSdHx8WrffhvFExflUtGucObdwPoC9jAcexcp6wyVYzNvbL78O-DUGmdEeUtbJw3MGCJNYzZVPY/s1600/point+2_x-hwy+y-cty_colour-cyl.png)
如果把 variables 設成 factor 的話,那每個參數就會變成一個 character,會以不同的顏色表示,而非色階。
ggplot(mpg, aes(hwy, cty, colour = factor(cyl))) + geom_point() |
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwiWCSRo7KNxW9yrQcHtkhpSd-sTYXxghgO2EXr0a8wZa4XDm__jUJTPS4-v0mWJPNagtAXG-2I5PeRrjEM7W_Wb-EyEARwdtn5VywVm1yEhv7uNNZwAxtMu5dXU951LjaHxu_kA9S2r8/s1600/Point+3_x-hwy+y-cty_colour+factor-cya.png)
如果要指定所有數據點的顏色,就要把指令放在 geom_point() 裡面,用 color = ' ' 。
ggplot(mpg, aes(displ, cty)) + geom_point(color = 'skyblue') |
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht0eNmGh2ZVpvCeJhHAZASB25tikJL1DYQXYNjpjs3B52sJEIBS862026fyr6gz7uK9gS4sHVDfOhkAYYfbQ0L3xXPA-jhdtI83C1PFMLndqCMDlJeN-21aUcdUrCvTbXCCVILG5j16cM/s1600/Point+4_x-hwy+y-cty_colour-blue.png)
也可以用不同的形狀顯示數據點: shape =
ggplot(mpg, aes(hwy, cty, shape = factor(year))) + geom_point() |
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ0SS7FG_3mfJODPqHN9xO8O4adrDXa18nWBpVwgldz6XuutzpO4AwjmuTPlpZ-sp7eAVwLrvqe6qMv7AAxiauA3zmI6Y1fdhlrXV0eWTVKPApGO1ivXbQEmd3xlKcgXrHwV_tIkIN7_M/s1600/Point+5_x-hwy+y-cty_shape.png)
也可以一點的大小呈現: size =
下面同時呈現顏色和大小的不同。
ggplot(mpg, aes(hwy, cty, colour = cyl, size = displ)) + geom_point() |
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6wwcBfBwcIYDteWaPsJeCA553Q-7vHOfAATLjBqVDHKxhNjOaLOUfzvHqfkgVy_D-xi2AiIEkUED48TF0jmaqbm9ilBUDneTQUrwPUP5KqtjpTLPRZn0Y0s9ZnxZBdF_yhrjFYcN5ijY/s1600/Point+6_x-hwy+y-cty-colour-cyl_size-displ.png)
也可以同時用三種方式呈現三個不同的 variables。
ggplot(mpg, aes(hwy, cty, colour = cyl, size = displ, shape = factor(year))) + geom_point() |
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVSWHYv_VNmqCYAHEbcJdGMI9kEqyD-fKth1lB2jydoaKSL_dMatsjZDYHd_JCiE7kwSkAYDPBsboHNyLdmEwlq4Q7hSQMg4jpIWH83MM0c5oLqlM6HishUG6sIlpZ_Yz2iV3GwVctfqo/s1600/Point+7_x-hwy+y-cty_colour-cyl_size-displ_shape-year.png)
2. Boxplot: geom_boxplot()
Box plot 的中間那一條是 medium (中間值,不是平均值),就是一個數列中, 最中間的那一個。上面那條線代表數列中的 25th percentiles (百分位),也就是中間值到最大值間的中間值,叫 Q3;下面那條線則是數列中的 75th percentiles,就是中間值到最小值間的中間值 ,叫 Q1。Q1 和 Q3 之間的距離,也就是 Q3 - Q1,叫做 IQR (interquartile range)。(還是不懂的可以看這個影片)
Box plot 的上下會有兩條鬚鬚,叫 whisker。它的長度在 R 裡的預設是 1.5,也就是:
To max end: Q3 + 1.5 * IQR
To min end: Q1 - 1.5 * IQR
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsTGU5Gcu70Z0JdFEsHFNSbU29ily4lFiiufIZUjpQ90YNg21vL592DLBVomMXRNmXlF3Jl9xTWrfVPl6vWDQPxrfnq8cXrOOuINCDdOyKEw2cIfDE_DPdMaivAS_udmhfmiyt_ht2e8s/s1600/Boxplot+IQRs.png)
X-axis 需要是 factor (function) 或是 text (character),例如 cyl 雖是整數,但沒把它設為 factor,就會變成下面這樣。
ggplot(mpg, aes(factor(cyl), cty)) + geom_boxplot()
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvVnJOjo1BhQPITgl2yZ1FdGcO5Z1EoXb9ewrFFPhBLTbbS6rrSd6KFfiUEvY-tiSqnT2zAwr6fbHNunEPREzESJEflzAi9-1768GVOjC84zrpRu5iQtt0hf5ak6JgDnIpHS1klk_nyo4/s1600/Boxplot+1_x-cyl+y-cty.png)
如果每個點要有自己的 box,需要把 X-axis 設成:factor(cyl)
ggplot(mpg, aes(factor(cyl), cty)) + geom_boxplot() |
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLeiszvO8wWa9Jq_7Qh9GNT74r45MqU8jXclh7J6-CYdPreSb09olwhdMk64F62feKYuFa0T7liCQrQcSP0KiyFw2EOGJnlzYGtQJItw-z5k63S_EL7xfe3HV-7fRQXbaqffH4BlPJkco/s1600/Boxplot+2_x-factor-cyl+y-cty.png)
如果是用 drv 或 class 當 X-axis,因為它本身就是 character,所以不用把它設成 factor。
ggplot(mpg, aes(drv, hwy)) + geom_boxplot() |
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif-GKQxp23ydpA1GKDaEM71ar6uGvLZHpvN5kyWuvhimv-Qy61OT_UmlQ0UREgiOCjN8g1xjl0_qTI0mcahv5j-DcBacFu-tlwU53gecrJv6Wyp923tpkZZqgGnkyVkt0J7OSzYJ2V5aE/s1600/Boxplot+3_x-drv+y-hwy.png)
如想想依其他參數的數據大小排的話,可以用 reorder(x, var),會由小至大(由左到右)排列,所以句法會是:aes(reorder (x, var), y))
ggplot(mpg, aes(reorder(drv, cty), cty)) + geom_boxplot() |
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2zYnyMhju5LmMdTBMP471gts18uvp7R-RYiIEMreSXRWlLPuBVb34e1p-4e6_v50bvJjkcmU6VKSSjksM4e6oZi1qcygpPd0InGbqGpm3hlhWqZYqnkmDSxFf46EGQ5cErytSXmEXWYY/s1600/Boxplot+4_x-reorder-drv+y-cty.png)
上面是依 cty 的大小由左至右,由小至大排列,Y-axis 可以設為一樣是 cty,也可以設其他的,不需要一樣,例如設為 displ。
ggplot(mpg, aes(reorder(drv, cty), displ)) + geom_boxplot() |
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCJ5LCYxxMXD4hk5P4tK6IkddQzz7OlOjaWt3MHM_616p7Jn9SPImGHJJbxDYBPcrYwwGt58bLcUnyywEB-yfTS9_eiGweaYZvx1fh4OEsT4WzNUkdrxn7CZ0M4sC5jmpL7h3xcO__T08/s1600/Boxplot+5_x-drv-reorder-cty+y-displ.png)
可以看到上面兩張圖都是依 cty 的大小排列,由左到右皆為 r - 4 - f,但是出來的卻不同。
如果想要依特別的順序排列,需要把參數設為 factor,包括 character (text) 也是,然後再用 levels = c(' ',' ',' ') 指定你要的排序,所以句法會是:aes(factor(x, levels = c()), y)
ggplot(mpg, aes(factor(drv, levels = c('f', 'r', '4')), cty)) + geom_boxplot() |
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeZ3jEcz5Jflzr7FGD2snBWvxcae6euxcqHYmjtZpMlcEeuOTtsF9tLJ_-SjJIalcaXjJDMo-z3JIWQnbLZa7eJc5tDyrOB1qiUiSv7Dfw-pvladxJP7h2aL5buIpJVreRmsRKg9Ljc2M/s1600/Boxplot+6_x-drv-levels+y-cty.png)
X-axis 依指定的 f - r - 4 的順序排列。
結果發現寫了兩個圖就太長了,剩下的放下篇吧。(這樣會超過三篇了說)
下篇的另外四種圖請看這:Ggplot | Histogram, Bar graph & Line plot
沒有留言:
張貼留言
歡迎發表意見