2017年2月5日 星期日

R | 畫圖 ggplot2

用 ggplot2 畫圖,裡面有各種圖,請參考這裡:Geoms
這邊存筆記,細節教學請參考這裡:Introduction to R - Part 2

library(ggplot2)
data(mpg)

ggplot 是 ggplot2 中的 function,記得在跑之前要放 library(ggplot2),先跑過這個再跑圖。


點圖:geom_point()

ggplot(mpg, aes(x = displ, y = cty)) + geom_point()

p <- ggplot(mpg, aes(displ, cty)) + geom_point() ## default 是 x, y,所以可以省略。
p

class(p) ## class() 告訴你這個 object 屬於什麼

ggsave("plot1.pdf") ## 把圖存成 pdf file

ggplot(mpg, aes(hwy, cty, colour = class)) + ## 加入顏色,依 class 分色。
  geom_point()

# 分兩層時,+ 要放在一行的最後才能跑。

ggplot(mpg, aes(displ, class, color =  drv)) +
  geom_point()

ggplot(mpg, aes(x = hwy, y = cty, colour = cyl)) +
  geom_point()
## 指定 cyl 的顏色,如果沒指定顏色,會自動用色階。

ggplot(mpg, aes(x = hwy, y = cty, colour = factor(cyl))) + geom_point()
## 指定 cyl 裡的各個數字(分類)用不同顏色。

和上面不同的是如果沒有加 factor,會用連續數字畫色階,例如圖旁的標示會出現 4-7 的色階。如果用 factor,cyl 裡面有的數字(分類)才會出現,例如 cyl 裡面只有 4, 5, 7, 8,圖旁邊的 figure legend 就只會出現這四個點和四種顏色。

ggplot(mpg, aes(displ, cty)) +
  geom_point(color='blue')
## 如果要指定顏色的話,要放在 geom_point() 裡面,而不是放在 aes() 裡面。

ggplot(mpg, aes(x = hwy, y = cty, shape = factor(year))) + ## 用點的樣式來區分
  geom_point()

ggplot(mpg, aes(hwy, cty, size =  displ)) +
  geom_point(color='blue') ## 用點的大小來區分

ggplot(mpg, aes(x = hwy, y = cty, colour = factor(cyl),
  shape=factor(year), size=displ)) + ## 可以合併所有的參數在一張圖裡
  geom_point()


Histogram: geom_histogram()

ggplot(mpg, aes(cty)) +
  geom_histogram(bins=10) ## number of bins. (overridden by binwidth; defaults to 30)

ggplot(mpg, aes(x=cty)) +
 geom_histogram(binwidth = 1, color='blue')
## The width of the bins. The default is to use bins bins that cover the range of the data.

ggplot(mpg, aes(x=cty)) +
 geom_histogram(aes(y=..ncount..))
## ncount: count, scaled to maximum of 1 (Y-axis 範圍變成 0 到 1。)


頻率圖 frequency polygons:geom_freqpoly()

ggplot(mpg, aes(x=cty)) + geom_freqpoly(bins = 10, color='blue')

ggplot(diamonds, aes(x=price, colour=cut)) + geom_freqpoly(bins = 10)

(ps. histogram & freqpoly 細節語法可以參考這裡:histograms & frequency polygons)


Bar graph: geom_bar()

ggplot(mpg, aes(x=cty, color=cyl)) + geom_bar(bins = 10)


Box plot: geom_boxplot()

ggplot(mpg, aes(factor(cyl), cty)) + geom_boxplot()

ggplot(mpg, aes(factor(cyl), cty)) +
  geom_boxplot(coef = NULL)  ## length of the whiskers as multiple of IQR (defaults to 1.5)

ggplot(mpg, aes(x=reorder(drv, cty, median), y=cty)) +
  geom_boxplot() ## Y-axis 數值由左到右排列成由小到大

ggplot(mpg, aes(factor(drv, levels=c('f', 'r', '4')), cty)) + ## 指定 X-axis 排序
  geom_boxplot()  

(ps. box plot 細節語法可以參考這裡:box plot)


Smoothers

A “smoother” is a line overlaid on the plot that can help bring out the dominant pattern by leaving out some of the variability (“wigglyness”) in the data.

加一條曲線圖(regression line),預設有 confidence intervals 的灰色陰影。

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  geom_smooth() ## regression line

ggplot(mpg, aes(x=displ, y=hwy)) +
  geom_point() +
  geom_smooth(se=FALSE, method = "lm")
#把陰影去掉:se=FALSE
# lm: least-squares linear regression

ggplot(mpg, aes(displ, hwy, shape=factor(cyl))) +
  geom_point() +
  geom_smooth(method="lm")

p1 <- ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(colour=factor(cyl))) +
  geom_smooth(aes(y = cty), se=FALSE) ## regression line

p2 <- ggplot(mpg, aes(displ, hwy))
 #把第一層 aes() 設成一個獨立 layer,這樣就不用每次重複打。
p2 +
 geom_point(aes(colour=factor(cyl))) +
 geom_smooth(method="lm") ## least-sequres linear regression

p2 +
 geom_point(aes(colour=factor(cyl))) +
 geom_smooth(aes(colour=factor(cyl)), method="lm")
 # 把 aes() 設在 smoother 裡就會每個 factor 都有一個 regression line。

# 跟 p2 相比

p3 <- ggplot(mpg, aes(displ, hwy, color=factor(cyl))) # 把 aes() 設在第一層會有同樣的效果
p3 +
 geom_point() +
 geom_smooth(method="lm")


Grouping

p2 <- ggplot(mpg, aes(displ, hwy))
p2 +
 geom_point() +
 geom_smooth(aes(group=factor(cyl)), method="lm", se=FALSE)


ggplot(mpg, aes(x=displ, y=hwy)) +
  geom_point() +
  geom_smooth(se=FALSE, method = "lm", formula = y~poly(x,2))



以上功能已寫在 R Script (R-ggplot),有興趣的可以下載來跑跑看。如果剛開始跑時出現 error 訊息的話,先跑最前面三行 library,之後再跑下面的 function 試試看。


註記:這篇當初在寫的時候因為懶得弄圖,加上沒花太多時間去把每種圖搞懂,所以很簡約。不過後來有補好幾篇詳細的,可以看這一串文章:ggplot









2 則留言:

  1. 稍微瀏覽一下您ggplot2相關的文章,真是相見恨晚
    比付費課程都還清楚了
    謝謝分享

    回覆刪除
  2. 很開心對你有幫助,其實寫這些原本只是用來當我的筆記,目的是當我半年沒用之後,再回來看能夠快速 pick up,不用再從頭研究一遍。XD

    回覆刪除

歡迎發表意見