一.基本概念
"一張統(tǒng)計圖形就是從數據到幾何對象(geometric object, 縮寫為geom, 包括點、線、條形等)的圖形屬性(aesthetic attributes, 縮寫為aes, 包括顏色、形狀、大小等)的一個映射。此外, 圖形中還可能包含數據的統(tǒng)計變換(statistical transformation, 縮寫為stats), 最后繪制在某個特定的坐標系(coordinate system, 縮寫為coord)中, 而分面(facet, 指將繪圖窗口劃分為若干個子窗口)則可以用來生成數據中不同子集的圖形。" 源自ggplot2的作者[Hadley Wickham]。
1.數據data和映射mapping
將數據中的變量映射到圖形屬性,映射控制了兩者之間關系。

2.標度scale
標度負責控制映射后圖形屬性的顯示方式。具體形式上來看是圖例和坐標刻度。 Scale和Mapping是緊密相關的概念。

3.幾何對象Geom
幾何對象代表我們在圖中實際看到的圖形元素,如點、線、多邊形等。

4.統(tǒng)計變換Stat
對原始數據進行某種計算,例如對二元散點圖加上一條回歸線。

5.坐標系統(tǒng)Coord
坐標系統(tǒng)控制坐標軸幵影響所有圖形元素,坐標軸可以進行變換以滿足不同的需要。

6.圖層Layer
數據、映射、幾何對象、統(tǒng)計變換等構成一個圖層。圖層可以允許用戶一步步的構建圖形,方便單獨對圖層進行修改。

7.分面Facet
條件繪圖,將數據按某種方式分組,然后分別繪圖。分面就是控制分組繪圖的方法和排列形式。

8.主題theme
theme()函數中的選項可以調整字體、背景、顏色、網格線。
mytheme <- theme(plot.title=element_text(
+face="bold.italic", size="14", color="brown"), #指定圖的標題應該為粗斜體棕色14號
+axis.title=element_text(face="bold.italic", size=10, color="brown"),#軸的標題為粗斜體的棕色10
+axis.text=element_text(face="bold", size=9, color="darkblue"),#軸標簽為粗體的深藍色9號
+panel.background=element_rect(fill="white",color="darkblue"),#圖片區(qū)域有白色的填充和深藍色的邊框
+panel.grid.major.y=element_line(color="grey",linetype=1),#主水平網格應該是灰色的實線
+panel.grid.minor.y=element_line(color="grey", linetype=2),#次水平網格應該是灰色的虛線
+panel.grid.minor.x=element_blank(), #垂直網格不輸出
+legend.position="top") #圖例展示在頂部
設置完成后使用 myeheme
ggplot(Salaries, aes(x=rank, y=salary, fill=sex)) +geom_boxplot() +labs(title="Salary by Rank and Sex", x="Rank", y="Salary") +mytheme #使用之前 mytheme設置的內容
9.存儲和輸出
在ggplot2中,有更簡單的保存方法,ggsave()能更方便保存
選項包括保存哪副圖形,保存在哪里,以什么形式保存。
myplot<-ggplot(data=mtcars,aes(x=mpg))+geom_histogram()
ggsave(file="mygraph.png",plot=myplot,width=5,height=4)
即將myplot保存為名為mygraph.png的5英寸*4英寸PNG格式的圖片
如果忽略plot=選項,最近創(chuàng)建的圖形會被保存。
二.簡單示例
1)散點圖
1.數據
在ggplot2中, 所接受的數據集必須為數據框(data.frame)格式
library(ggplot2)
str(mpg)
head(mpg)


2.映射
aes()函數是ggplot2中的映射函數, 所謂的映射即為數據集中的數據關聯(lián)到相應的圖形屬性過程中一種對應關系
每個點都有自己圖像上的屬性,比如x坐標,y坐標,點的大小、顏色和形狀,這些都叫做aesthetics,即圖像上可觀測到的屬性,通過aes函數來賦值
p <- ggplot(data=mpg, mapping=aes(x=cty, y=hwy))
p

summary(p)

3.幾何對象
通過”+”以圖層的方式加入點的幾何對象
p + geom_point()

summary(p + geom_point())


注1:2、3步可合并為
ggplot(data=mpg, aes(x=cty, y=hwy)) + geom_point()
注2:改變橫縱坐標名稱
ggplot(data=mpg, aes(x=cty, y=hwy)) + geom_point() + xlab("A") + ylab("B")

注3:geom_point()中參數的用法
#shape
ggplot(data=mpg, aes(x=cty, y=hwy)) + geom_point(shape=17)


#size
ggplot(data=mpg, aes(x=cty, y=hwy)) + geom_point(size=2.5)

#color
ggplot(data=mpg, aes(x=cty, y=hwy)) + geom_point(color="red")

4.將年份映射到顏色/形狀/大小屬性(按年份分組)
將分組變量(因子或字符變量,可通過factor()強制性將非因子變量轉為因子變量)賦值給顏色或形狀或大小屬性(變量賦值必須在aes里面),實現(xiàn)分組散點圖的繪制。
①顏色
ggplot(mpg,aes(x=cty, y=hwy, colour=factor(year)))+geom_point()

②大小
ggplot(mpg,aes(x=cty, y=hwy, size=factor(year)))+geom_point()

③形狀
ggplot(mpg,aes(x=cty, y=hwy, shape=factor(year)))+geom_point()

5.增加平滑曲線
geom_smooth可以增加一條線,而stat_smooth是可以添加一個置信區(qū)間范圍的(利用方差值)。
①stat_smooth
ggplot函數中賦予的值是全局性質的,如果不希望全局生效,放到后面+對應的圖層中去。
如:
CASE1:stat_smooth對不同顏色的點,各自擬合曲線
ggplot(mpg,aes(x=cty, y=hwy, colour=factor(year)))+geom_point()+stat_smooth()

CASE2:stat_smooth對所有點,擬合一條曲線
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(colour=factor(year)))+stat_smooth()
#等價形式
ggplot() +geom_point(data=mpg, aes(x=cty, y=hwy, colour=factor(year)))+stat_smooth(data=mpg, aes(x=cty, y=hwy))

②geom_smooth
geom_smooth():這個函數就是為散點圖添加一條平滑的曲線(包含直線),它有個參數method, 指定曲線平滑方法,可選"lm", "glm", "gam", "loess", "rlm",默認會使用"loess"。
ggplot(mpg,aes(x=cty, y=hwy))+ geom_point(aes(colour=factor(year))) + geom_smooth(method = lm)
#等價形式
ggplot(mpg,aes(x=cty, y=hwy))+ geom_point(aes(colour=factor(year))) + stst_smooth(method = lm)

更改平滑曲線為一條紅色虛線
ggplot(mpg,aes(x=cty, y=hwy))+ geom_point(aes(colour=factor(year))) + geom_smooth(method = lm,colour="red",linetype=2)

其中l(wèi)inetype依次為1=實線,2=虛線,3=點,4=點破折號,5=長破折號,6=雙破折號
6.自定義顏色/形狀
scale_color_brewer()或者scale_color_manual()函數自定義點的顏色;scale_shape_manual()函數自定義點的形狀;
下面我們將分組變量year同時賦值給顏色和形狀屬性。
①改變顏色
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(colour=factor(year)))+stat_smooth(method = lm)+scale_color_manual(values =c('blue','red'))

②改變顏色,通過Accent(調色板)
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(colour=factor(year)))+stat_smooth(method = lm)+scale_color_brewer(palette = "Accent")

③改變形狀
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(shape=factor(year)))+stat_smooth(method = lm)+scale_shape_manual(values = c(2, 9))

④同時改變顏色和形狀
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(colour=factor(year),shape=factor(year)))+stat_smooth(method = lm)+scale_color_brewer(palette = "Accent")+scale_shape_manual(values = c(2, 9))

7.將連續(xù)型變量(排量)映射到顏色/大小屬性
①大小
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(size=displ))+stat_smooth()

②大小,指定我們size的變化范圍,即控制點的絕對大小的范圍,默認點的大小為1-6ms,可更改為2-8ms
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(size=displ))+stat_smooth()+scale_size_continuous(range = c(2, 8))

③大小,同時將年份按顏色分組
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(colour=factor(year),size=displ))+stat_smooth()

④顏色
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(color=displ))+stat_smooth()

⑤顏色(通過人為設置色階)
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(color=displ))+stat_smooth()+ scale_color_gradient(low="lightblue", high="darkblue")

8.分面facet
分面設置在ggplot2應該也是要經常用到的一項畫圖內容,在數據對比以及分類顯示上有著極為重要的作用。
facet_wrap和facet_grid不同在于facet_wrap是基于一個因子進行設置,facets表示形式為:~ 變量
而facet_grid是基于兩個因子進行設置,facets表示形式為:變量 ~ 變量(行 ~ 列),如果把一個因子用點表示,也可以達到facet_wrap的效果,也可以用加號設置成兩個以上變量
例如:變量+變量~變量 的形式,表示對三個變量設置分面。
①facet_wrap
facet_wrap(facets, nrow = NULL, ncol = NULL, scales = "fixed", shrink = TRUE, as.table = TRUE, drop = TRUE)
下面對參數進行說明:
· nrow,ncol : 分面所設置成的行和列,參數為數值,表示幾行或者幾列
· scales : 參數fixed表示固定坐標軸刻度,free表示反饋坐標軸刻度,也可以單獨設置成free_x或free_y(把scales 設置成free之后,可以看出每個分面都有自己的坐標刻度,當然我們也可以單獨對x軸或y軸設置)
· shrink : 也和坐標軸刻度有關,如果為TRUE(默認值)則按統(tǒng)計后的數據調整刻度范圍,否則按統(tǒng)計前的數據設定坐標
· drop : 表示是否去掉沒有數據的分組,默認情況下不顯示,邏輯值為FALSE
CASE1:
#利用facet分別顯示不同年份的數據
ggplot(mpg,aes(x=cty, y=hwy))+geom_point(aes(colour=class,size=displ))+ stat_smooth()+scale_size_continuous(range = c(2, 8))+facet_wrap(~ year, ncol=1)

facet_wrap()是關鍵,facet與wrap兩個詞組合,就是逐面地包起來。里面我們選擇按照year這個變量來分層,就可以將1999與2008分開。一定要注意!這里在year前面有個~,回歸中的用法。而最后的ncol = 1代表著我們的小窗口是1列,指定了1列之后,默認就是兩行(因為年份一共只有兩種)。
colour = class。class也是數據集中的一個變量,代表不同種類的汽車,而因為汽車的種類非常多,所以顏色也就變的很多。
CASE2:
ggplot(mpg,aes(x=cty, y=hwy))+geom_point(aes(colour=class,size=displ))+ stat_smooth()+scale_size_continuous(range = c(2, 8))+facet_wrap(~ year)

如果不加ncol=1,會默認橫著排列
CASE3:
ggplot(mpg,aes(x=cty, y=hwy))+geom_point(aes(colour=class,size=displ))+ stat_smooth()+scale_size_continuous(range = c(2, 8))+facet_wrap(~ year,nrow=1)

或者想要指定幾行,則使用nrow = 1
②facet_grid
facet_grid(facets, margins = FALSE, scales = "fixed", space = "fixed", shrink = TRUE, labeller = "label_value", as.table = TRUE, drop = TRUE)
下面對參數進行說明:
· scales 、shrink、drop 同上
· as.table :和小圖排列順序有關的選項。如果為TRUE(默認)則按表格方式排列,即最大值(指分組level值)排在表格最后即右下角,否則排在左上角
· margins :通過TRUE或者FALSE表示否設置而一個總和的分面變量,默認情況為FALSE,即不設置
· space :表示分面空間是否可以按數據進行縮放,參數和scales一樣
CASE1:
ggplot(mpg,aes(x=cty, y=hwy))+geom_point(aes(colour=class,size=displ))+ stat_smooth()+scale_size_continuous(range = c(2, 8))+facet_grid(.~ year)

一行多列
CASE2:
ggplot(mpg,aes(x=cty, y=hwy))+geom_point(aes(colour=class,size=displ))+ stat_smooth()+scale_size_continuous(range = c(2, 8))+facet_grid(year~ .)

一列多行
9.其他調整
①更改透明度alpha
當數據量非常大時,會導致數據重疊點非常嚴重,可通過使用半透明的點避免。alpha參數控制點的透明度。從0(完全透明)到1(不透明)。
ggplot(mpg,aes(x=cty, y=hwy))+geom_point(aes(size=2,color="red",alpha=0.005))

②用坐標控制圖形顯示范圍xlim,ylim
ggplot(mpg,aes(x=cty, y=hwy))+geom_point(aes(size=2,color="red",alpha=0.005))+coord_cartesian(xlim = c(15, 25),ylim=c(15,30))

③調整坐標軸coord
CASE1:橫縱坐標交換coord_flip()
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(colour=factor(year),size=displ))+stat_smooth()

ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(colour=factor(year),size=displ))+stat_smooth()+ coord_flip()

CASE2:轉換為極坐標系coord_polar()
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(colour=factor(year),size=displ))+stat_smooth()+ coord_polar()

④去除掉擬合曲線的置信區(qū)間 se=FALSE
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(colour=factor(year),size=displ))+stat_smooth(se=FALSE)

⑤增加標題 opts
CASE1:使用ggtitle
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(colour=factor(year),size=displ))+ggtitle("汽車油耗與型號")

CASE2:使用ggtitle,并居中hjust
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(colour=factor(year),size=displ))+ggtitle("汽車油耗與型號")+theme(plot.title = element_text(hjust = 0.5))

hjust 其實就是左右移動的意思,0.5
CASE3:使用labs
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(colour=factor(year),size=displ))+labs(title="汽車油耗與型號")

⑥增加標題橫縱坐標名稱 labs
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(colour=factor(year),size=displ))+labs(y='每加侖高速公路行駛距離',x='每加侖城市公路行駛距離')

⑦改變圖例位置 theme
決定放哪兒的參數是:theme()中的legend.position,默認狀態(tài)theme(legend.position = "right"),然后我們可以通過“right”, “l(fā)eft”, “top”, “bottom”,把他放在上/下/左,或者去掉“none”
ggplot(mpg,aes(x=cty,y=hwy))+geom_point(aes(colour=factor(year),size=displ))+theme(legend.position = "left")

⑧改變圖例名稱、大小guides
ggplot(mpg, aes(x=cty, y=hwy))+ geom_point(aes(colour=class,size=displ))+ guides(size=guide_legend(title='排量'),colour = guide_legend(title='車型',override.aes=list(size=5)))

⑨去掉背景theme
ggplot(mpg, aes(x=cty, y=hwy))+ geom_point(aes(colour=class,size=displ))

ggplot(mpg, aes(x=cty, y=hwy))+ geom_point(aes(colour=class,size=displ))+theme(panel.background=element_blank())

⑩共用同一坐標軸,作對比
ggplot(mpg, aes(x=cty))+geom_point(aes(y=hwy,colour="red"))+geom_point(aes(y=displ,colour="green"))

等價形式
ggplot()+geom_point(aes(x=mpg$cty,y=mpg$hwy),color="red")+geom_point(aes(x=mpg$cty,y=mpg$displ),color="green")

2)直方圖
1.一般形式
ggplot(mpg,aes(x=hwy))+geom_histogram()

2.內置的統(tǒng)計變換
geom_histogram()默認使用stat_bin(按照區(qū)間統(tǒng)計頻數)這個統(tǒng)計變換, 而這個統(tǒng)計變換會生成(1)count:每個組里觀測值的數目, (2)density:每個組里觀測值的密度和(3)x:組的中心位置這三個變量
①調整分箱(bin),即直方圖的寬度binwidth
ggplot(mpg,aes(x=hwy))+geom_histogram(binwidth =0.5)

②調整縱坐標為密度density
將原本的頻數直方圖變成頻率密度直方圖,density表示y坐標用密度而不是用默認count來代替,density前后都用..標出的原因是為了避免和dataframe中已有的列名有重復。這樣表示賦值并不是dataframe中的列名含義,而是系統(tǒng)的參數含義
ggplot(mpg,aes(x=hwy,y=..density..))+geom_histogram(binwidth =0.5)

3.調整每個年份對應一個直方圖facet_wrap
CASE1:
ggplot(mpg,aes(x=hwy)) +geom_histogram()+facet_wrap(~year, ncol=1)

CASE2:
ggplot(mpg,aes(x=hwy)) +geom_histogram()+facet_grid(year~.)

注:這里的year如果改成factor(year),會報錯
4.元素位置的調整
元素位置的調整共有5種包括了(1)dodge:并排方式; (2)fill:堆疊圖像元素, 并將高度標準化為1,(3)identity:不做任何調整; (4)jitter:給點增加擾動避免重合和(5)stack:堆疊圖像元素。
①fill=factor(year)
fill=factor(year)表示按年進行填充顏色。為什么不用前面說到的colour = ?這是ggplot繪圖中,對于線與點這種面積為0的結構,它的顏色就直接使用colour =進行指定,而對條形和密度區(qū)域,例如條形圖,柱狀圖,扇形圖(特殊的柱狀圖),箱線圖等等有面積的圖形,其面積的顏色,我們需要用fill =來指定。
ggplot(mpg,aes(x=hwy,fill=factor(year)))+geom_histogram()
#等價形式
ggplot(mpg)+geom_histogram(aes(x=hwy,fill=factor(year)))

②dodge
也可以將其分開,side-by-side地畫直方圖,即并排
ggplot(mpg,aes(x=hwy,fill=factor(year)))+geom_histogram(position="dodge")

③fill
還可以使用position="fill",按照相對比例來畫。垂直的堆疊并規(guī)范其高度相等。
ggplot(mpg,aes(x=hwy,fill=factor(year)))+geom_histogram(position="fill")

④identity
很多情況下, 采用固定的x軸和y軸值來進行作圖, 此時需要用stat = “identity” 來申明, 即表示不對數據進行統(tǒng)計變換
ggplot(mpg,aes(x=hwy,y=class))+geom_histogram(stat = "identity")

⑤jitter
對于點來說,是減少點重疊
ggplot(mpg,aes(x=hwy,fill=factor(year)))+geom_histogram(position = "jitter")

⑥stack
ggplot(mpg,aes(x=hwy,fill=factor(year)))+geom_histogram(position="stack")

5.增加密度曲線
stat_density()表示添加統(tǒng)計學中的密度曲線,進行密度估計。geom = 'line'指定為線形, position = 'identity'表示一個一一映射, size = 1.5 是強制修改線的尺寸,為原先的1.5倍。最后的aes(colour = factor(year))為修改擬合密度曲線的顏色,這里就是用的colour =而不是fill =
ggplot(mpg,aes(x=hwy)) + geom_histogram(aes(fill = factor(year), y = ..density..),alpha = 0.3, colour = 'black') + stat_density(geom = 'line', position = 'identity', size = 1.5,aes(colour = factor(year))) + facet_wrap(~ year, ncol = 1)

等價形式
geom_density=stat_density(geom="line")
ggplot(mpg,aes(x=hwy)) + geom_histogram(aes(fill = factor(year), y = ..density..),alpha = 0.3, colour = 'black') + geom_density(position = 'identity', size = 1.5,aes(colour = factor(year))) + facet_wrap(~ year, ncol = 1)

3)條形圖
條形圖和直方圖是很像的,直方圖把連續(xù)型的數據按照一個個等長的分區(qū)(bin)來切分,然后計數,畫條形圖。而條形圖是分類數據,按類別計數。
1.一般形式
ggplot(mpg,aes(x=class))+geom_bar()

2.根據計數排序后繪制的條形圖
class2<-mpg$class
class3<-reorder(class2,class2,length)
ggplot(mpg,aes(x=class3))+geom_bar(aes(fill=class3))

其中 reorder函數:首參選定因子向量,次參選定排序依據的數據向量,F(xiàn)UN參數選定匯總函數
例如:
iss
即根據count列對spray列中的因子水平進行重排序,匯總數據為mean
3.根據年份分別繪制條形圖,position控制位置調整參數
p<-ggplot(mpg,aes(class3,fill=factor(year)))
p+geom_bar(position='identity',alpha=0.5)

CASE1:(并立方式)
p+geom_bar(position='dodge')

CASE2:(疊加方式)
p+geom_bar(position='stack')

CASE3:(相對比例)
p+geom_bar(position='fill')

CASE4:(分面顯示)
p+geom_bar(aes(fill=class3))+facet_wrap(~year)

4)餅圖
餅圖實際上就是柱狀圖,只不過是使用極坐標而已。
首先x軸,只有一個柱子,柱子的寬度我們設置為1,geom_bar(width = 1),也就是鋪滿整個圖,而柱子按照class變量來分類,并且是堆疊的(默認是堆疊條形圖)。這時的圖,也就是p4是一個“千層餅”。然后我們按照y軸為原點,用coord_polar(theta = "y"),就成了我們的餅圖了。
p <- ggplot(mpg, aes(x = factor(1), fill = factor(class))) + geom_bar(width = 1)
p

y映射為角度(此時x恒等于1,即半徑相同)
p + coord_polar(theta = "y")

5)靶心圖
p <- ggplot(mpg, aes(x = factor(1), fill = factor(class))) + geom_bar(width = 1)
p + coord_polar()
#等價形式
p + coord_polar(theta = "x")

6)玫瑰圖/雞冠花圖
繪制 Coxcomb Plots (雞冠花圖,又名玫瑰圖),width的值可以調整各個扇形區(qū)域之間的距離。
ggplot(mpg, aes(x = factor(mpg$class)))+geom_bar(width = 0.7,aes(color=factor(mpg$class))) + coord_polar()

增添顏色
ggplot(mpg, aes(x = factor(mpg$class),fill=mpg$class))+geom_bar(width = 0.7) + coord_polar()

7)箱線圖
width為箱線圖的寬度。
ggplot(mpg, aes(class,hwy,fill=class))+geom_boxplot()

8)小提琴圖
使用geom_violin()繪制小提琴圖,同樣改變透明度。小提琴圖相比于箱線圖多了各個類別分布的信息,是圖像變得更加漂亮。
然后我們用geom_jitter()添加擾動點,其實就是將數據點等間隔的排列,顯得更加高大上。其中的shape = 21指定的是擾動點的形狀,我們用21號,也就是空心點(默認是實心點)。
ggplot(mpg, aes(class,hwy,fill=class))+geom_violin(alpha = 0.3) + geom_jitter(shape = 21)

9)地毯圖
快速查看每個坐標軸上數據的分布密疏情況
地毯圖的放置,b=底部,l=左部,t=頂部,r=右部,bl=左下部
ggplot(mpg, aes(class,hwy,fill=class))+geom_boxplot()+geom_rug(side="l",color="red")
10)多重圖
將多個圖形放到單個圖形最簡單的方式是gridExtra包中的grid.arrange()函數
install.packages("gridExtra")
library(gridExtra)
p1<-ggplot(mpg, aes(class,hwy))+geom_boxplot()
p2<-ggplot(mpg, aes(class))+geom_bar()
p3<-ggplot(mpg,aes(x=cty, y=hwy))+geom_point()
grid.arrange(p1,p2,p3,ncol=3)
