Liz's Blog

就是要學R #10:ggplot2幫你搞定資料視覺化

| Comments

這篇學的是圈圈圓圓的統計圖,雖然不像Excel拉一下就可以畫出很酷炫的圖,但核心概念不難。首先都是裝套件、導入套件,然後ggplot(x,y,df) + geom_XXX()的變化型。

Udemy
課程名稱:Data Science and Machine Learning Bootcamp with R
講師:Jose Portilla

有關ggplot2使用,詳細可參考ggplot2 cheat sheet
1.Histograms(直方圖)

install.packages("ggplot2")
install.packages("ggplot2movies")
library(ggplot2)
library(ggplot2movies)
df <- movies <- movies[sample(nrow(movies), 100), ]
head(df)

#利用qplot()函數,快速畫出直方圖。以下範例為qplot(x軸,data,圖形類別,binwidth=預設有30個bin修改binwidth會改變bin數,alpha=透明度)
qplot(rating,data=df,geom='histogram',binwidth=0.1,alpha=0.8)

#ggplot(資料,aes(x軸資料)) 並用預設條件畫出直方圖geom_histogram()
pl <- ggplot(df,aes(x=rating))
pl2 <- pl + geom_histogram()

#增加binwidth,color=bin外框顏色,fill=bin內填色
pl2 <- pl + geom_histogram(binwidth=0.1,color='#69cbbb',fill='#69cbbb',alpha=0.4)

#增加xlab=x軸,ylab=y軸,ggtitle標題。
pl2 <- pl + geom_histogram(binwidth=0.1,color='#69cbbb',fill='#69cbbb') + xlab('Review')+ ylab('Count') + ggtitle('Movie Review')

#linetype外框,有實線(solid)、空白(blank)、虛線(dotted)、點破折號(dotdash)、長破折號()及雙破折號()。
pl2 <- pl + geom_histogram(binwidth=0.1,color='#69cbbb',fill='#69cbbb',linetype='dotted') + xlab('Review')+ ylab('Count')

#條狀依Y軸而改變顏色aes(fill=..count..)
pl2 <- pl + geom_histogram(binwidth=0.1,aes(fill=..count..)) + xlab('Review')+ ylab('Count')

#aes(fill=..count..)也可以改成scale_fill_gradient漸層色。
pl3 <- pl2 + scale_fill_gradient('Count',low='blue',high='red')
pl4 <- pl2 + scale_fill_gradient('Count',low='darkgreen',high='lightblue')

#也可以加入核密度圖(Kernel Density Estimation)
pl2 <- pl + geom_histogram(aes(y=..density..)) + geom_density(color='red')

註一:qplot()函數中文說明可參考這篇,寫得很清楚。
註二:Kernel Density Estimation可以參考這篇

2.Scatterplots(散佈圖)看相關性、正反比很常見。

df <- mtcars
head(df)

#使用qplot()函數,qplot(x軸,y軸,資料框架名稱)
qplot(wt,mpg,data=df)

#除了x軸及y軸,也加入第三個變數,並可由顏色或大小來顯示。也可以加入第四個變數,但資料可能會變得非常凌亂。
qplot(wt,mpg,data=df,color=cyl)
qplot(wt,mpg,data=df,size=cyl)
qplot(wt,mpg,data=df,size=cyl,color=cyl)
qplot(wt,mpg,data=df,size=cyl,color=hp,alpha=0.6)

#ggplot(資料框架名稱,aes(x軸,y軸)) + geom_point()散佈圖。
pl <- ggplot(df,aes(x=wt,y=mpg)) 
pl2 <- pl + geom_point()

#以顏色顯示第三個變數。
pl2 <- pl + geom_point(aes(color=cyl))

#或將第三個變數轉成factor,並以顏色顯示。
pl2 <- pl + geom_point(aes(color=factor(cyl)))

#或將第三個變數轉成factor,並以大小顯示。
pl2 <- pl + geom_point(aes(size=factor(cyl)))

#或將第三個變數轉成factor,並以形狀顯示。
pl2 <- pl + geom_point(aes(shape=factor(cyl)))

#或將第三個變數轉成factor,並以顏色、形狀、大小顯示。
pl2 <- pl + geom_point(aes(shape=factor(cyl),color=factor(cyl)),size=4,alpha=0.6)

#也可使用scale_colour_gradient()將第三個變數漸層顯示。
pl2 <- pl + geom_point(aes(colour = hp),size=4) + scale_colour_gradient(high='red',low = "blue")

3.Barplots(長條圖)算是最常見的圖。

#利用ggplot(資料框架名稱,aes(x軸)) + geom_bar()做出長條圖
pl <- ggplot(mpg, aes(class))
pl2 <- pl + geom_bar()

#長條圖中變數drv在各class佔的實際數字。
pl2 <- pl + geom_bar(aes(fill = drv))

#長條圖中變數drv在各class佔的百分比。(把每個類別中的總數當成100%)
pl2 <- pl + geom_bar(aes(fill = drv), position = "fill")

#並列同一類別的數據。
pl2 <- pl + geom_bar(aes(fill = drv), position = "dodge")

4.Boxplots(盒狀圖或盒鬚圖)可以顯示出最小值、最大值、上下四分位數、中位數。

df <- mtcars
head(df)

#x軸是先把cyl轉成factor,y軸是mpg,再用mtcars資料框架畫出盒狀圖。
qplot(factor(cyl), mpg, data = df, geom = "boxplot")

#x軸是先把cyl轉成factor,y軸是mpg,再用mtcars資料框架畫出盒狀圖。
pl <- ggplot(df, aes(factor(cyl), mpg))
pl2 <- pl + geom_boxplot()

#橫的盒狀圖
pl2 <- pl + geom_boxplot() + coord_flip()

#每條bar可填滿轉成factor的cyl類別顏色。
pl2 <- pl + geom_boxplot(aes(fill = factor(cyl)))

#或者改變中心及外框顏色。
pl2 <- pl + geom_boxplot(fill = "grey", color = "blue")

5.2 Variable Plotting適用於二維連續變數。

df <- movies

#利用qplot()或ggplot()畫出密度圖。
qplot(x=year, y=rating, data = df, geom = "density2d")
ggplot(df,aes(x=year,y=rating)) + geom_density2d()

#利用 ggplot(資料框架名稱,x軸,y軸)+ geom_bin2d()畫出柱狀2D密度圖,如熱點圖。
pl <- ggplot(df,aes(x = year,y=rating))
pl2 <- pl + geom_bin2d()

#控制bin的大小
pl2 <- pl + geom_bin2d(binwidth=c(2,1))

#bin變成六角網格
pl2 <- pl + geom_hex()

#漸層上色
pl2 <- pl + geom_hex() + scale_fill_gradient(high='red',low='blue')

6.Coordinates and faceting

#藉由coord_cartesian(xlim,ylim)限定只畫出特定範圍的圖
pl <- ggplot(mpg,aes(x=displ,y=hwy)) + geom_point()
pl2 <- pl + coord_cartesian(xlim=c(1,4),ylim=c(15,30))

#藉由coord_fixed(y/x)來顯示圖形比例,預設是1:1。
pl2 <- pl + coord_fixed(ratio = 1/3)

#利用facet_grid()分成好幾個網格,算是把第三個變數拿出來並排y軸比較。
pl <- ggplot(mpg, aes(displ, cty)) + geom_point()
pl2 <- pl + facet_grid(. ~ cyl)

#x軸並排比較。
pl2 <- pl + facet_grid(drv ~ .)

#有四個變數時,可以使用facet_grid()這樣並排比較。
pl2 <- pl + facet_grid(drv ~ cyl)

7.Themes風格設計(可先載入theme_set(theme_bw())設定,或者加在圖形設定後面my_plot + theme_bw()

df <- mtcars
head(df)
pl <- ggplot(df,aes(x=mpg,y=hp)) + geom_point()

#使用內建風格
pl + theme_bw()
pl + theme_classic()
pl + theme_dark()
pl + theme_get()
pl + theme_light()
pl + theme_linedraw()
pl + theme_minimal()
pl + theme_void()

#想要變成專業的經濟學人風,套入ggthemes就好
library(ggthemes)
pl + theme_excel()
pl + theme_economist()
pl + theme_economist_white()

【延伸閱讀】
1.就是要學R #1:Basic 基礎篇
2.就是要學R #2:Matrix 矩陣篇
3.就是要學R #3:Data Frame 資料框架篇
4.就是要學R #4:List 列表篇
5.就是要學R #5:Import & Export 匯入匯出篇(csv & excel)
6.就是要學R #6:Import & Export 匯入匯出篇(SQL & web scraping)
7.就是要學R #7:R programming 基礎篇
8.就是要學R #8:R Programming 進階篇
9.就是要學R #9:資料前處理篇(dplyr、tidyr)
10.就是要學R #10:ggplot2幫你搞定資料視覺化
11.就是要學R #11:資料視覺化應用篇(ggplot2、Plotly)
12.就是要學R #12:機器學習之線性迴歸實作篇
13.就是要學R #13:機器學習之邏輯迴歸實作篇
14.就是要學R #14:機器學習之K Nearest Neighbor(KNN)實作篇
15.就是要學R #15:機器學習之決策樹、隨機森林實作篇
16.就是要學R #16:機器學習之Support Vector Machine(SVM)實作篇
17.就是要學R #17:機器學習之K Means Clustering實作篇
18.就是要學R #18:機器學習之自然語言處理(NLP)實作篇
19.就是要學R #19:機器學習之類神經網路(Neural Net)實作篇

Comments

comments powered by Disqus