ggplot2包學習
一、寫在前面:
1、一個更為原始的問題:什麼是圖形的語法?
Wilkinson在其《Grammar of Graphics》告訴我們:
一張統計圖形就是從數據到幾何對象(geometric object,縮寫為geom,包括點、線、條形等)的圖形屬性(aesthetic attributes,縮寫為aes,包括顏色、形狀、大小等)的一個映射。
此外,圖形中還可能包含數據的統計變換(statistical transformation,縮寫為stats),最後繪製在某個特定的坐標系(coordinate system,縮寫為coord)中,而分面則可以用來生成數據不同子集的圖形。總而言之,一張統計圖形就是由上述這些獨立的圖形部件所組成的。
2、幾個概念:
- 數據(data):將要展示的數據;
- 映射(mapping):數據中的變數到圖形成分的映射;
- 幾何對象(geom):用來展示數據的幾何對象,如geom_point(點),geom_bar(條形圖),geom_abline(線圖)、geom_boxplot(箱線圖)、geom_density(密度圖)、geom_histogram(直方圖);
- 圖形屬性(aes):決定了圖形的外觀,如字體大小、標籤位置及刻度線;
- 標度(scale):決定了變數如何被映射到圖形屬性上。scale_data(日期)、scale_discrete(離散值)、scale_shape(不同形狀展示不同值)、scale_size(不同大小展示不同值);
- 坐標(coord):數據如何被映射到圖中,如coord_cartesian:笛卡爾坐標、coord_polar:極坐標、coord_map:地理投影;
- 統計變換(stat):對數據進行匯總,如箱線圖:stat_boxplot、線圖:stat_abline、直方圖:stat_bin、密度圖:stat_density、添加平滑曲線:stat_smooth、繪製匯總數據:stat_summary;
- 分面(facet):用來描述數據如何被拆分為子集,以及對不同子集是如何繪製的。facet_grid(將分面放置在二維網格中)、facet_wrap(將一維的分面按二維排列)
3、ggplot2圖形基本語法:
- ggplot2的核心理念是將繪圖和數據分離,數據相關的繪圖與數據無關的繪圖相分離;
- ggplot2是按圖層作圖;
- ggplot2保有命令式作圖的調整函數,使其更具靈活性;
- ggplot2將常見的統計變換融入到了繪圖中;
- ggplot有明確的起始與終止(一句話一幅圖),圖層之間的疊加是靠「+」實現的,越後面其圖層越高;
- ggplot2元素概括如下:最大的是plot(指整張圖,包括background和title),其次是axis(包括stick、text、title和stick)、legend(包括background、text、title)、facet這是第二層次;
- 完整的公式總結:
ggplot(data=,aex(x=,y=))+ngeom_XXX(...)+...+stat_XXX(...)+...+nannotate(...)+...+labs(...)+nscale_XXX(...)+coord_XXX(...)+guides(...)+theme(...)+nfacet_XXX(...)n
二、 繪製條形圖:
1、根據數據集繪製條形圖:
x<-c("A","B","C","D","E")ny<-c(13,22,14,19,33)ndf<-data.frame(x=x,y=y)nggplot(data=df,mapping=aes(x=x,y=y))+geom_bar(stat="identity")#繪製原始數據,不進行統計變換n
顯示結果如下:
2、根據隨機種子繪製條形圖:
set.seed(3000)#把隨機種子設置為3000nx<-sample(c(1,3,4,6,7),size=1000,replace=TRUE,prob=c(0.1,0.2,0.2,0.3,0.2))nggplot(data=data.frame(x=x),mapping=aes(x=x,y=..count..))+geom_bar(stat=count)n
顯示結果如下:
3、通過fill和colour參數設置條形圖的填充色和邊框色:
ggplot(data=data.frame(x=x),mapping=aes(x=factor(x),y=..count..))+ngeom_bar(stat="count",fill="blue",colour="red")n
顯示結果如下:
4、繪製有序的條形圖:
#未排序的條形圖,默認按x的值的順序nx<-c(A,B,C,D,E,F,G)ny<-c(xx,yy,yy,xx,xx,xx,yy)nz<-c(10,34,24,9,14,23,11)ndf<-data.frame(x=x,y=y,z=z)nggplot(data=df,mapping=aes(x=x,y=z,fill=y))+geom_bar(stat=identity)n
顯示結果如下:
#按z值的大小,重新排列條形圖的順序,只需將aes()中的x屬性用reorder()函數更改即可nggplot(data=df,mapping=aes(x=reorder(x,z),y=z,fill=y))+geom_bar(stat="identity")+xlab("x")n
顯示結果如下:
三、繪製折線圖:
1、繪製單條折線圖:
install.packages("lubridate")#處理日期時間相關的R包,強烈推薦nlibrary(ggplot2)nlibrary(lubridate)nMonth<-month(seq(from=as.Date(2017-01-01),to=as.Date(2017-08-01),by=month))nWeight<-c(93.6,92.8,93,95,92.6,93,91.8,90.6)ndf<-data.frame(Month=Month,Weight=Weight)nggplot(data=df,mapping=aes(x=factor(Month),y=Weight,group=1))+geom_line()+xlab(Month)n
顯示結果如下:
#往折線上添加標記,只需在折線圖的基礎上再加上geom_point()函數即可nggplot(data=df,mapping=aes(x=factor(Month),y=Weight,group=1))+geom_line()+xlab(Month)+geom_point()n
顯示結果如下:
2、繪製多條折線圖:
#基於顏色的多條折線圖nset.seed(1234)nyear <- rep(1990:2015, times = 2)#1990-2015重複2次ntype <- rep(c(A,B),each = 26)nvalue <- c(runif(26),runif(26, min = 1,max = 1.5))#生成26個1-1.5的隨機數ndf <- data.frame(year = year, type = type, value = value)nggplot(data = df, mapping = aes(x = year, y = value, colour = type)) + geom_line()n
顯示結果如下:
#基於形狀的多條折線圖nggplot(data = df, mapping = aes(x = year, y = value, linetype = type)) + geom_line()n
顯示結果如下:
ggplot2還支持對摺線圖的顏色、形狀、大小、透明度等進行自定義設置:
自定義線條或點的顏色:scale_color_manual()
自定義線條類型:scale_linetype_manual()
自定義點的形狀:scale_shape_manual()
自定義點的大小或線條的寬度:scale_size_manual()
自定義透明度:scale_alpha_manual()
ggplot(data = df, mapping = aes(x = year, y = value, linetype = type, colour = type, shape = type, fill = type))+ geom_line() + geom_point() #繪製線圖和點圖+ scale_linetype_manual(values = c(1,2)) #自定義線條類型+ scale_color_manual(values = c(steelblue,darkred)) #自定義顏色+ scale_shape_manual(values = c(21,23)) #自定義點形狀+ scale_fill_manual(values = c(red,black)) #自定義點的填充色n
顯示結果如下:
3、繪製堆積面積圖:
實現方法:在geom_area()函數加上一個離散變數映射到fill:
set.seed(1234)nyear <- rep(1990:2015, times = 2)#1990-2015重複2次ntype <- rep(c(A,B),each = 26)nvalue <- c(runif(26),runif(26, min = 1,max = 1.5))#生成26個1-1.5的隨機數ndf <- data.frame(year = year, type = type, value = value)nggplot(data = df, mapping = aes(x = year, y = value, fill = type))+geom_area()n
顯示結果如下:
如果要為每一塊面積圖的頂部加上一條直線,可以通過以下方式實現,其中,colour設置面積圖邊框的顏色,size設置邊框線的粗細,alpha設置面積圖和邊框線的透明度。
ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(colour = red, size =1, alpha = .7) + guides(fill = guide_legend(reverse = TRUE))n
顯示結果如下:
4、繪製百分比面積圖:
set.seed(1234)nyear<-rep(1990:2015,times=4)ntype<-rep(c("A","B","C","D"),each=26)nvalue<-c(runif(26),runif(26,min=1,max=1.5),runif(26,min=1.5,max=2),runif(26,min=2,max=2.5))ndf<-data.frame(year=year,type=type,value=value)nggplot(data=df,mapping=aes(x=year,y=value,fill=type))+geom_area(position = "fill",alpha=0.8)+guides(fill=guide_legend(reverse = FALSE))n
顯示結果如下:
四、繪製散點圖:
散點圖通常用來刻畫兩個連續性變數之間的關係。
1、基本散點圖:
install.packages("gcookbook")#導入R數據包nlibrary(gcookbook)nggplot(heightweight,aes(x=ageYear,y=heightIn))+geom_point()n
顯示結果如下:
#可將分組變數(因子或字元變數)賦值給顏色或形狀屬性,實現分組散點圖的繪製nggplot(heightweight,aes(x=ageYear,y=heightIn,shape=sex,color=sex))+geom_point()n
顯示結果如下:
2、基於連續型變數映射:
可將連續型變數映射到散點的顏色或大小等存在漸變的屬性上,從而呈現三個連續型變數之間的關係
ggplot(heightweight,aes(x=ageYear,y=heightIn,size=weightLb,color=weightLb))+geom_point()n
顯示結果如下:
3、處理散點重合的基本思路:
當數據點非常多時,可能會導致數據點重疊嚴重,處理方法如下:
1)使用半透明的點
2)數據分箱,並用矩形表示{stat_bin2d()}
3)數據分箱,並用六邊形表示{stat_binhex()}
4)使用二維密度估計,並將等高線添加到散點圖中{stat_density2d()}
5)向散點圖中添加邊際地毯
set.seed(112)nx <- rnorm(10000)ny <- rnorm(10000,0,2)ndf <- data.frame(x = x,y = y)n# 不作任何處理nggplot(df,aes(x = x,y = y))+ngeom_point()n
顯示結果如下:
# 使用透明度處理點的重疊問題nggplot(df,aes(x = x,y = y))+geom_point(alpha = 0.15)#透明度0.15n
顯示結果如下:
# 分箱,並用矩陣表示nggplot(df,aes(x = x,y = y))+stat_bin2d()n
顯示結果如下:
# 使用stat_density2d作二維密度估計,並將等高線添加到散點圖中 nggplot(df,aes(x = x,y = y))+geom_point()+stat_density2d()n
顯示結果如下:
#向散點圖中添加邊際地毯(軸須線)nggplot(faithful,aes(x = eruptions, y = waiting)) + geom_point() + geom_rug()n
顯示結果如下:
#添加擬合線nggplot(heightweight, aes(x=ageYear, y=heightIn, color=sex)) + geom_point() + scale_color_brewer(palette="Set1") + geom_smooth()n
由圖可看出:身高隨著年齡增長而增加,到一定年齡後停止增長,且男性比女性平均身高更高
五、描述數據分布
1、繪製直方圖:
library(gcookbook)nggplot(faithful,aes(x=waiting))+geom_histogram(binwidth_=8,bins=10,fill="red",colour="black")n
顯示結果如下:
2、繪製核密度曲線圖:
可以用geom_density映射一連續變數。
library(gcookbook)nggplot(faithful, aes(x=waiting))+geom_density(fill="blue", alpha=.2)+xlim(35, 105)n
顯示結果如下:
#密度曲線與直方圖共存nggplot(faithful, aes(x=waiting, y=..density..)) +n geom_histogram(fill="cornsilk", colour="grey60", size=.2) +n geom_density() +n xlim(35, 105)n
顯示結果如下:
六、參考資料:
1、《R語言_ggplot2:數據分析與圖形藝術》,作者: 哈德利·威克姆 (Hadley Wickham)
出版社: 西安交通大學出版社,出版年: 2013-5-1;
2、手把手教你使用ggplot2繪製條形圖;
3、手把手教你使用ggplot2繪製折線圖;
4、手把手教你使用ggplot2繪製餅圖;
5、R----ggplot2包介紹學習。
推薦閱讀:
※如何培養麥肯錫式的分析思維
※勒索病毒席捲全球,給我們文檔管理帶來什麼樣的警示?
※你因為什麼喜歡數據分析?
※數據讀書分享系列篇(1):那些年數據分析師必讀書單
※為分析達人而生 諸葛io全面支持SQL查詢分析功能