ggplot2包的目的是提供一個全面的晒骇、基于語法的亩进、連貫一致的圖形生成系統(tǒng)衙傀,允許用戶創(chuàng)建新穎的、有創(chuàng)新性的數(shù)據(jù)可視化圖形渐行。
1、簡介ggplot2語法
下面將從一個例子來看看ggplot2的基本語法铸董。
library(ggplot2) # 載入ggplot2包
ggplot(data=mtcars, aes(x=wt,y=mpg)) + # 指定繪圖的數(shù)據(jù) (1)
geom_point(pch=17,color='red',size=2) + # 繪圖函數(shù)及其參數(shù) (2)
geom_smooth(method='lm',color='green',linetype=2) + # 繪圖函數(shù)(擬合曲線)(3)
labs(title='ggplot2', x='Weight', y='MPG') + # 添加注釋信息(標(biāo)題)(4)
theme(plot.title = element_text(hjust = 0.5)) # 調(diào)整標(biāo)題位置 (5)
現(xiàn)在我們來一步步解析上面的代碼:
(1)初始化圖形并指定要用到的數(shù)據(jù)來源(mtcars)和變量(wt祟印、mpg)。aes()
函數(shù)指定每個變量扮演的角色粟害,這里的wt映射到x軸數(shù)值蕴忆,mpg映射到y(tǒng)軸數(shù)值。當(dāng)需要對數(shù)據(jù)進行分類時我磁,還可將分類因子映射到圖形性狀或顏色上面孽文;
(2)繪圖函數(shù)(也稱幾何函數(shù))使用一個或幾個函數(shù)向圖中添加幾何對象(簡寫為geom),包括點夺艰、線芋哭、條、箱線圖和陰影區(qū)域郁副,這里向圖中添加了散點圖以及一條擬合曲線(代碼3)减牺。當(dāng)需要在一個圖中使用多個數(shù)據(jù)來源進行畫圖時,可以單獨在每個幾何函數(shù)中指定數(shù)據(jù)源存谎;
(4)labs()
函數(shù)是可選的拔疚,用來添加注釋(包括軸標(biāo)簽和標(biāo)題信息);
(5)theme()
函數(shù)用來設(shè)置全局配置既荚,這里設(shè)置了標(biāo)題的位置為中間稚失;
除了上面的一些基本設(shè)置外,ggplot2還提供了分組和小面化(faceting)以及圖形組合的方法恰聘,這些較為高級的方法將在下面進行介紹句各。
2吸占、幾何函數(shù)
ggplot()
函數(shù)可用來指定要繪制的數(shù)據(jù)源和變量,也可不在ggplot()中設(shè)置而在每個幾何函數(shù)中單獨設(shè)置所用的數(shù)據(jù)源及變量凿宾,幾何函數(shù)則指定了這些變量如何在視覺上進行展示(點矾屯、線、條初厚、箱線圖等)件蚕。使用命令ls(pattern = '^geom_', env = as.environment('package:ggplot2'))
可以查看所有可用的幾何函數(shù),常用的幾何函數(shù)如下表:
函數(shù) | 圖形 | 常用選項 |
---|---|---|
geom_bar() | 條形圖 | color产禾、fill排作、alpha |
geom_boxplot() | 箱線圖 | color、fill亚情、alpha纽绍、notch、width |
geom_density() | 密度圖 | color势似、fill拌夏、alpha、linetype |
geom_hist0gram() | 直方圖 | color履因、fill障簿、alpha、linetype栅迄、binwidth |
geom_hline() | 水平線 | color站故、alpha、linetype毅舆、size |
geom_jitter() | 抖動圖 | color西篓、size、alpha憋活、shape |
geom_line() | 線圖 | colorvalpha岂津、linetype、size |
geom_point() | 散點圖 | color悦即、alpha吮成、shape、size |
geom_rug() | 地毯圖(軸須圖) | color辜梳、size |
geom_smooth() | 擬合曲線 | method粱甫、formula、color作瞄、fill茶宵、linetype、size |
geom_text() | 文字注解 | 很多宗挥,參加函數(shù)幫助 |
geom_violin() | 小提琴圖 | color乌庶、fill叶摄、alpha、linetype |
geom_vline() | 垂線 | color安拟、alpha、linetype宵喂、size |
對于幾何函數(shù)中每個選項的意義糠赦,詳見下表:
選項 | 詳述 |
---|---|
color | 對點、線和填充區(qū)域的邊界進行著色 |
fill | 對填充區(qū)域著色锅棕,如條形和密度區(qū)域 |
alpha | 顏色的透明度拙泽,從0(完全透明)到1(不透明) |
linetype | 線條類型,1=實線裸燎,2=虛線顾瞻,3=點,4=破折號德绿,5=長破折號荷荤,6=雙破折號 |
size | 點的尺寸和線的寬度 |
shape | 點的性狀(和pch一樣,0=方形移稳,1=圓形蕴纳,2=三角形,等等) |
position | 繪制諸如條形圖和點等對象的位置个粱。對于條形圖來說古毛,‘dodge’將分組條形圖并排,‘stacked’則為堆疊條形圖都许,‘fill’標(biāo)準(zhǔn)化堆疊條形圖稻薇。對于點來說,‘jitter’抖動減少點重疊 |
binwidth | 直方圖的寬度 |
notch | 表示方塊圖是否為缺口(TRUE胶征、FALSE)塞椎,常見于箱線圖 |
sides | 地毯圖的安置('b'=底部,'l'=左部睛低,'t'=頂部忱屑,'r'=右部,'bl'=左下部暇昂,等等) |
width | 箱線圖的寬度 |
library(ggplot2)
mtcars$am <- factor(mtcars$am, levels=c(0,1), labels=c('Automatic', 'Manual'))
ggplot() +
geom_point(data=mtcars, aes(x=wt,y=mpg,shape=am, color=am),size=2) + # 性狀和顏色都使用am進行分組
geom_smooth(data=mtcars, aes(x=wt,y=mpg),method='lm',color='green',linetype=2) +
labs(title='ggplot2', x='Weight', y='MPG') +
theme(plot.title = element_text(hjust = 0.5))
下圖是對例子的一個改進莺戒,在上面的代碼中可以看到,我們將數(shù)據(jù)分別放在了各個幾何函數(shù)中急波,之所以這么做是為了對所有的數(shù)據(jù)進行擬合曲線从铲,若將數(shù)據(jù)源一起放在ggplot()
中進行設(shè)置的話,后面進行數(shù)據(jù)擬合的話會分別對am的分組數(shù)據(jù)進行擬合澄暮。
下面再看一個箱線圖的簡單例子名段。
> library(ggplot2)
> mtcars$am <- factor(mtcars$am, levels=c(0,1), labels=c('Automatic', 'Manual'))
> mtcars$cyl <- factor(mtcars$cyl, levels=c(4,6,8), labels=c('cyl-4', 'cyl-6','cyl-8'))
> ggplot(data=mtcars, aes(x=cyl, y=mpg, fill=am)) + # 使用am填充分組
+ geom_boxplot() +
+ labs(title='ggplot2', x='cyl', y='MPG') +
+ theme(plot.title = element_text(hjust = 0.5))
在這里我們使用箱線圖展示了cyl和mpg的關(guān)系阱扬,并使用am進行了二次分組,分組方式為填充顏色表示(fill=am
)伸辟。
最后我們再來看一個使用了多個幾何函數(shù)的圖形麻惶,該圖形使用的是Salaries數(shù)據(jù)集。
> data(Salaries,package='car')
> ggplot(Salaries, aes(x=rank, y=salary)) +
+ geom_boxplot(fill='cornflowerblue', color='black',notch=TRUE) + # 添加箱線圖
+ geom_point(position='jitter',color='blue',alpha=0.5) + # 添加打散(jitter)了的散點圖
+ geom_rug(sides='l',color='green') # 在左側(cè)添加軸須圖
+ labs(title='ggplot2') # 添加標(biāo)題信夫,默認(rèn)添加在左上方
3窃蹋、分組
通常為了更好地理解數(shù)據(jù),在一個圖中畫出兩個或更多組的觀察值通常都是很有幫助的静稻。ggplot2中的分組是通過一個或多個帶有諸如性狀警没、顏色、填充振湾、尺寸和線條類型的視覺特征的分組變量來完成的杀迹。ggplot2中的aes()
函數(shù)負責(zé)分配變量(圖形的視覺特征),所以這是一個分配分組變量的自然地方押搪。
這里我們將繼續(xù)使用Salaries數(shù)據(jù)集树酪,首先來查看下薪水是如何隨學(xué)術(shù)等級而變化的。代碼:
> ggplot(data=Salaries, aes(x=salary, fill=rank)) + # 根據(jù)學(xué)術(shù)等級rank進行分類
+ geom_density(alpha=0.3) # 添加密度圖
從圖中可以看到不同學(xué)術(shù)等級的薪水雖然有重疊大州,但仍能看到隨著學(xué)術(shù)水平的增加薪水提高了嗅回。接下來,我們通過性別和學(xué)術(shù)等級分組摧茴,繪制獲得博士學(xué)位年數(shù)與薪水的關(guān)系绵载,代碼:
> ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank, shape=sex)) +
# 這里使用了兩個分組變量sex和rank,在圖中分別通過不同的顏色和不同的形狀表示
+ geom_point()
最后苛白,選項可以通過不同的方式使用娃豹,這取決于他們發(fā)生在
aes()
函數(shù)內(nèi)部還是外部。讓我們比較下面的一段代碼繪制的圖形:
> p1<-ggplot(Salaries, aes(x=rank, fill=sex)) + geom_bar()
> p2<-ggplot(Salaries, aes(x=rank)) + geom_bar()
> p3<-ggplot(Salaries, aes(x=rank,fill='red')) + geom_bar()
> p4<-ggplot(Salaries, aes(x=rank)) + geom_bar(fill='red')
> library(gridExtra)
> grid.arrange(p1,p2,p3,p4,ncol=4) # 組合圖形
在第一個圖(p1)中购裙,sex變量通過條形圖中的填充顏色來展示懂版。在第二個圖(p2)中,沒有設(shè)置分組變量也沒有設(shè)置填充顏色躏率,只繪制了各個rank的數(shù)量躯畴。第三個圖(p3)中,ggplot2假定‘red’是變量名薇芝,結(jié)果得到的結(jié)果與圖2基本相同蓬抄。第四個圖(p4),使用紅色來填充圖形夯到。
4嚷缭、刻面
如果組在圖中并排出現(xiàn)而不是重疊為單一的圖形,關(guān)系就是清晰的。我們可以使用facet_wrap()
和facet_grid()
函數(shù)創(chuàng)建網(wǎng)格圖形(也稱刻面圖)阅爽。這些函數(shù)的使用方法如下路幸,其中var,rowvar付翁,colvar是因子:
語法 | 結(jié)果 |
---|---|
facet_wrap(~var, ncol=n) | 將每個var水平排列成n列的獨立圖 |
facet_wrap(~var, nrow=n) | 將每個var水平排列成n行的獨立圖 |
facet_grid(rowvar~colvar) | rowvar和colvar組合的獨立圖简肴,其中rowvar表示行,colvar表示列 |
facet_grid(rowvar~.) | 每個rowvar水平的獨立圖百侧,配置成一個單列 |
facet_grid(.~colvar) | 每個colvar水平的獨立圖砰识,配置成一個單行 |
接下來我們使用mtcars數(shù)據(jù),以am和cyl作為分組變量對mpg進行分組繪制直方圖移层。
library(ggplot2)
mtcars$am <- factor(mtcars$am, levels=c(0,1), labels=c('Automatic', 'Manual'))
mtcars$cyl <- factor(mtcars$cyl, levels=c(4,6,8), labels=c('cyl-4', 'cyl-6','cyl-8'))
ggplot(data=mtcars, aes(x=mpg)) +
geom_histogram(fill='green') +
facet_wrap(~cyl, nrow=1) # 使用cyl作為分組變量將mpg分組繪制
library(ggplot2)
mtcars$am <- factor(mtcars$am, levels=c(0,1), labels=c('Automatic', 'Manual'))
mtcars$cyl <- factor(mtcars$cyl, levels=c(4,6,8), labels=c('cyl-4', 'cyl-6','cyl-8'))
ggplot(data=mtcars, aes(x=mpg)) +
geom_histogram(fill='green') +
facet_grid(am~cyl) # 同時使用am和cyl作為分組變量,交叉分組
5赫粥、擬合曲線
選項 | 描述 |
---|---|
method | 使用的平滑函數(shù)观话。可選的值包括lm, glm, smooth越平,rlm和gam频蛔,分別對應(yīng)線性,廣義線性秦叛,loess晦溪,健壯線性和廣義相加模型。默認(rèn)為smooth |
formula | 在光滑曲線中使用的公式挣跋,例如y~x 三圆,y~log(x) ,y~poly(x, n) |
se | 繪制置信區(qū)間避咆。默認(rèn)為TRUE |
level | 使用的置信區(qū)間水平(默認(rèn)為95%) |
fullrange | 指定擬合應(yīng)涵蓋全圖(TRUE)或僅僅是數(shù)據(jù)(FALSE)舟肉,默認(rèn)為FALSE |
本部分我們將分析一下添加平滑曲線(線性,非線性和非參數(shù))到散點圖中的方法查库。我們可以使用geom_smooth()
函數(shù)來添加一系列平滑曲線和置信區(qū)域路媚。函數(shù)的參數(shù)見下表:
選項 | 描述 |
---|---|
method | 使用的平滑函數(shù)》可選的值包括lm, glm, smooth整慎,rlm和gam,分別對應(yīng)線性围苫,廣義線性裤园,loess,健壯線性和廣義相加模型剂府。默認(rèn)為smooth |
formula | 在光滑曲線中使用的公式比然,例如y~x ,y~log(x) 周循,y~poly(x, n) |
se | 繪制置信區(qū)間强法。默認(rèn)為TRUE |
level | 使用的置信區(qū)間水平(默認(rèn)為95%) |
fullrange | 指定擬合應(yīng)涵蓋全圖(TRUE)或僅僅是數(shù)據(jù)(FALSE)万俗,默認(rèn)為FALSE |
這里使用Salaries數(shù)據(jù)集,我們先檢驗博士畢業(yè)年數(shù)和薪水之間的關(guān)系饮怯。在這個例子中闰歪,我們使用帶有95%置信區(qū)間的非參數(shù)光滑曲線(loess)。暫時忽略學(xué)術(shù)等級和性別蓖墅,代碼:
> data(Salaries, package='car')
> library(ggplot2)
> ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
+ geom_point() +
+ geom_smooth(color='red')
圖形顯示库倘,隨著博士畢業(yè)年數(shù)的增加,薪水先增加后來又會降低论矾。
接下來教翩,我們按性別擬合一個二次多項式回歸(一個彎曲):
> ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary, linetype=sex, color=sex, shape=sex)) +
+ geom_smooth(method=lm, formula=y~poly(x,2),se=FALSE,size=1) +
+ geom_point(size=2)
正如前面第一部分我們說的那樣,當(dāng)使用全局的數(shù)據(jù)源(在ggplot中設(shè)置)時贪壳,我們會擬合出分類數(shù)條曲線饱亿。這里我們分別對女性和男性的薪水隨博士畢業(yè)年限的變化擬合了兩條曲線。
6闰靴、修改ggplot2圖形的外觀
在R基本繪圖中彪笼,我們可以使用par()
函數(shù)定義全局參數(shù)。在ggplot2中提供了特定的函數(shù)來改變圖形外觀蚂且。
6.1 坐標(biāo)軸
ggplot2在創(chuàng)建圖形時會自動創(chuàng)建刻度線配猫、刻度標(biāo)記和坐標(biāo)軸標(biāo)簽,有時我們可能想自定義這些圖形杏死。前面我們已經(jīng)看到了labs()
函數(shù)可以用來添加標(biāo)題和軸標(biāo)題泵肄,本節(jié)中我們將自定義軸標(biāo)簽,自定義軸標(biāo)簽的函數(shù)如下:
函數(shù) | 選項 |
---|---|
scale_x_continous()淑翼、scale_y_continous | breaks=指定刻度標(biāo)記凡伊,labels=指定刻度標(biāo)記標(biāo)簽,limits=控制要展示的值得范圍 |
scale_x_discret()和scale_y_discret() | breaks=對因子的水平進行放置和排序窒舟,labels=指定這些水平的標(biāo)簽系忙,limits=表示那些水平應(yīng)該展示 |
coord_flip() | 顛倒X軸和Y軸 |
可以看到,ggplot2的函數(shù)區(qū)分x軸和y軸惠豺,以及軸線是否代表一個連續(xù)或離散變量(因子)银还。
下面我們將這些函數(shù)應(yīng)用到一個分組箱線圖中,其中包含按學(xué)術(shù)等級和性別分組的薪資水平洁墙,代碼:
> ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
+ geom_boxplot() +
+ scale_x_discrete(breaks=c('AsstProf', 'AssocProf', 'Prof'),
labels=c('Assistant\nProfessor', 'Associate\nProfessor', 'Full\nProfessor')) +
+ scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
labels=c('$50K','$100K','$150K','$200K')) +
+ labs(title='Faculty Salary by Rank and Sex', x='rank',y='salary')
可以很明顯的看到蛹疯,平均收入隨著學(xué)術(shù)排名的上升而上升,在每個學(xué)術(shù)等級中男性的薪資水平高于女性热监。
6.2 圖例
圖例是指如何用顏色捺弦、形狀尺寸等視覺特性表示數(shù)據(jù)特征的指南。ggplot2包能自動生成圖例,而且很多時候能滿足我們的需求列吼;但在某些時候幽崩,我們可能需要對其進行自定義。標(biāo)題和位置是最常用的定制特征寞钥。
當(dāng)更改圖例的標(biāo)題時慌申,必須考慮圖例是否基于顏色、尺寸理郑、形狀或他們的組合蹄溉。在6.1節(jié)中,圖例代表fill您炉,因此我們可以通過將fill='mytitle'
加到labs()
函數(shù)中來改變標(biāo)題柒爵。標(biāo)題的位置由theme()函數(shù)中的legend.position選項控制∽簦可能的值包括'left'棉胀、'right'(默認(rèn))、'top'和'bottom'囱晴。我們也可以在圖中給定位置指定一個二元向量膏蚓。下面我們對6.1節(jié)中的圖進行更改瓢谢,增加一個分類因子color=discipline
畸写,并改變圖例的標(biāo)題和位置。
> ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex, color=discipline)) +
+ geom_boxplot() +
+ scale_x_discrete(breaks=c('AsstProf', 'AssocProf', 'Prof'),
labels=c('Assistant\nProfessor', 'Associate\nProfessor', 'Full\nProfessor')) +
+ scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
labels=c('$50K','$100K','$150K','$200K')) +
+ labs(title='Faculty Salary by Rank and Sex', x='rank',y='salary',color='Discip', fill='Gender') +
### labs()中的color='Discip'和fill='Gender'分別表示color和fill兩個分類的圖例的名稱
+ theme(legend.position=c(0.1,0.8)) # 設(shè)置圖例位置
c(0.1,0.8)
分別表示距離左側(cè)邊緣10%和底部邊緣80%的部分氓扛。如果想刪除圖例則可以使用legend.position='none'
枯芬。
6.3 標(biāo)尺
ggplot2包使用標(biāo)尺把數(shù)據(jù)映射到可視化的空間中。標(biāo)尺既可以應(yīng)用到連續(xù)的變量采郎,也可以應(yīng)用到離散的變量千所。下面我們使用mtcars數(shù)據(jù)集,將disp變量映射到圖形中點的大小蒜埋,代碼:
> ggplot(mtcars, aes(x=wt, y=mpg, size=gear)) + # gear映射到散點的大小
+ geom_point(shape=21, color='black', fill='cornsilk') +
+ labs(x='Weight', y='Miles Per Gallon', title='Bubble Chart', size='Gear')
scale_color_manual()
函數(shù)來手動設(shè)定三個cyl的點的顏色整份。
> mtcars$cyl <- factor(mtcars$cyl, levels=c(4,6,8), labels=c('cyl-4', 'cyl-6','cyl-8'))
> ggplot(mtcars, aes(x=wt, y=mpg, color=cyl)) +
+ geom_point(shape=21) +
+ labs(x='Weight', y='Miles Per Gallon') +
+ scale_color_manual(values=c('red','blue','green'))
scale_color_brewer()
和scale_fill_brewer()
函數(shù)來指定顏色集烈评。
6.4 主題
theme()
函數(shù)中的選項可以讓我們調(diào)整字體火俄、北京、顏色和網(wǎng)格線等讲冠。主題可以使用一次瓜客,也可以保存起來應(yīng)用到多個圖中。
library(ggplot2)
data(Salaries, package='car')
mytheme<-theme(plot.title=element_text(face='bold.italic',size=14,color='brown',hjust=0.5), # 指定圖標(biāo)題的字體以及位置
axis.title=element_text(face='bold.italic',size=10,color='brown'), # 設(shè)置軸標(biāo)題的字體大小等
axis.text=element_text(face='bold.italic',size=9,color='darkblue'), # 軸標(biāo)簽字體設(shè)置
panel.background=element_rect(fill='white',color='darkblue'), # 背景設(shè)置
panel.grid.major.y=elemnt_line(color='grey',linetype=1), # 設(shè)置網(wǎng)格線
panel.grid.minor.y=element_line(color='grey', linetype=2), # 設(shè)置網(wǎng)格線
panel.grid.minor.x=element_blank()) # 垂直網(wǎng)格不輸出
ggplot(Salaries, aes(x=rank,y=salary,fill=sex)) +
geom_boxplot() +
labs(title='Salary by Rank and Sex',x='RANK',y='Salary') +
mytheme
7、組合圖
在基礎(chǔ)繪圖中谱仪,我們使用par()
函數(shù)的mfrow和mfcol參數(shù)和layout()
來將多個圖形組合起來玻熙。將多個ggplot圖形組在一起最簡單的方式是使用gridExtra包中的grid.arrange()
函數(shù),使用前需先安裝這個包芽卿。
下面我們將三個ggplot圖形合并到一個圖中揭芍,代碼:
> p1<-ggplot(data=Salaries, aes=(x=rank)) + geom_bar()
> p1<-ggplot(data=Salaries, aes(x=rank)) + geom_bar()
> p2<-ggplot(data=Salaries, aes(x=sex)) + geom_bar()
> p3<-ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) + geom_point()
> library(gridExtra)
> grid.arrange(p1, p2, p3)
> grid.arrange(p1, p2, p3, ncol=3)
8、保存圖形
保存圖形能使用基礎(chǔ)繪圖的方法卸例,但ggsave()
函數(shù)能更為方便地保存它称杨。它的選項包括保存那幅圖形,保存位置以及保存形式筷转。
myplot<-ggplot(data=mtcars, aes(x=mpg)) + geom_histogram()
ggsave(file='filename.tiff', plot=myplot, width=5, height=4)
我們可以通過將文件名的擴展格式設(shè)置為不同的格式來以不同的方式保存姑原。如果忽略plot=
選項,最近創(chuàng)建的圖形會被保存呜舒。