之前學習的繪圖方法是基于R的基礎(chǔ)繪圖系統(tǒng)。在R中一共有四種作圖系統(tǒng),分別為base(之前學的)、grid、lattice,以及ggplot2。其中g(shù)gplot2包的目標是提供一個全面的、基于語法的,連貫一致的圖形生成系統(tǒng),允許用戶創(chuàng)建新穎的、有創(chuàng)新性的數(shù)據(jù)可視化圖形。關(guān)于另外兩種的介紹,見p402。
一、預準備
1、安裝加載包
不像基礎(chǔ)繪圖方法可以直接使用,ggplot2包第一次使用要安裝、加載。
install.packages("ggplot2")
library(ggplot2)
2、加載實驗數(shù)據(jù)
(1)mtcars數(shù)據(jù)集包括32輛車的詳細信息。
data(mtcars)
(2)singer數(shù)據(jù)集來自lattice包,包括某合唱團的身高與聲音變量
data(singer, package="lattice")
#lattice包已在基礎(chǔ)安裝里
(3)Salaries數(shù)據(jù)集來自carData包(教材說是來自car包,可能是最近移動了),其包含了大學教授的收入信息,以及其它相關(guān)因素(級別、性別)。
install.packages("carData")
data(Salaries, package="carData")
二、基礎(chǔ)用法
一個簡單例子
ggplot(mtcars, aes(x=wt, y=mpg)) +
geom_point() +
labs(title="Automobile Data", x="Weight", y="Miles Per Gallon")
如上一個簡單的ggplot繪圖包括主要有以下三方面內(nèi)容,用加號(+)相連組成的:
1、ggplot()函數(shù):用于交代繪圖的數(shù)據(jù)來源,并指定要使用的變量信息。其中的aes()即用來指定繪圖涉及到的變量,及每個變量扮演的角色,有時也包括分組信息。
2、geom_ 幾何函數(shù):指明視覺呈現(xiàn)方式(在我理解就是繪圖類型);一張圖里可以有多個幾何函數(shù)呈現(xiàn),即使用多個geom類型函數(shù)。
3、lab()函數(shù):主要用于添加注釋信息(標題等)。部分常用參數(shù)如下
-
title =添加主標題;subtitle =添加副標題,位于主標題下面,字體更小。 -
caption =在圖形右下角添加文本,常用于描述數(shù)據(jù)來源。 -
x =與y =修改坐標軸標題,colour =修改圖例標題
ggplot()函數(shù)中的變量選擇要根據(jù)自己想要繪制什么樣的圖來研究什么樣的變量關(guān)系來決定。

補充:關(guān)于ggplot的繪圖變量交代也可放在每個具體的繪圖函數(shù)中,ggplot()僅交代下數(shù)據(jù)來源。比如
ggplot(data = mpg) +
geom_point(aes(x = displ, y = hwy))
# 如果只使用ggplot(data = mpg)只會得到灰色背景
三、關(guān)于geom函數(shù)
1、geom類型
目前一共有37個幾何函數(shù)可供使用,教材中列了常見的13種以及所涉及到的參數(shù)選項(p407)。比如
-
geom_bar()表示條形圖,涉及選項有color、fill、alpha; -
geom_boxplot()表示箱線圖,涉及選項有color、fill、alpha、notch、width; -
geom_histogram()表示直方圖,涉及選項有color、fill、alpha、linetype、binwidth; -
geom_point()表示散點圖,涉及選項有color、alpha、shape、size; -
geom_rug()表示地毯圖,涉及選項有color、size。
2、常見選項(詳見p408)
- fill 用于設(shè)置填充區(qū)域顏色;
- color 用于設(shè)置點、線,邊界的顏色;
- alpha 設(shè)置顏色透明度,1不透明;0透明;
- linetype 設(shè)置線條類型;
- shape 設(shè)置點的形狀;
- position 參數(shù)對于點圖來說 jitter 減少點重疊;對條形圖而言有 dodge、stacked、fill三種模式(具體在例子中說明)。
例圖:三圖綜合
ggplot(Salaries, aes(x=rank, y=salary)) +
geom_boxplot(fill="cornflowerblue",
color="black", notch=TRUE)+
geom_point(position="jitter", color="blue", alpha=.5)+
geom_rug(sides="l", color="black")
如圖為箱線圖、點圖,地毯圖的混合圖。
(1)對箱線圖設(shè)置了填充顏色、邊界和點的顏色,以及方塊缺口;
(2)對點圖設(shè)置了隨機抖動(否則點就排成一列,難以觀察)、點的顏色、點的透明度;
(3)對地毯圖設(shè)置了出現(xiàn)位置,以及線的顏色。

舉例-1:geom_smooth添加光滑曲線
除了上述提到的幾何函數(shù)類型,還有一種比較常見的函數(shù):為散點圖添加平滑曲線geom_smooth。其涉及到的參數(shù)有--(詳見p416)一般直接選默認參數(shù)。
-
method=設(shè)置使用的平滑函數(shù),默認為smooth的非參數(shù)光滑曲線;此外還可選lm(線性)、glm(廣義線性)、rlm(穩(wěn)健線性)、gam(廣義相加)。 -
formula=設(shè)置光滑函數(shù)公式,默認為y~x;如果是n次多項式,y~poly(x,n) -
se設(shè)置置信區(qū)間,默認TRUE。 -
level設(shè)置置信水平,默認95%
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
geom_smooth() + geom_point()
#直接使用默認參數(shù)

- 如上圖,散點的線性關(guān)系不是很明顯。因此可以擬合一個二次多項式的回歸的有參模型。
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
geom_smooth(method=lm, formula=y~poly(x,2),
se=FALSE, size=1) + #設(shè)置多項式擬合,并取消了置信區(qū)間
geom_point(size=2)

四、分組與刻面
繪圖時,若存在一個/多個分類變量可以就分組關(guān)系將圖分類,以研究分類變量對數(shù)據(jù)的分布影響。例如將全校的成績按各個班級角度來看。
1、分組
(1)特征:不同組的分類變量繪制在一張圖里。
(2)書寫格式:在aes()函數(shù)中指明用來區(qū)分分類變量的方法即可(比如顏色、符號形狀等);比如下例中的color=rank,左邊為區(qū)分方式(顏色)、右邊為分類變量(等級)。其它的分組依據(jù)還有:size =、alpha =、shape =
ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank)) +
geom_point()
這里繪制畢業(yè)年數(shù)與收入的關(guān)系,并想研究學術(shù)級別對其分布的影響

補充1:分組顏色方案是ggplot2默認的,也可以選擇ColorBrewer 提供的系列配色方案;或者直接自己自定義。例如下代碼---
ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank)) +
geom_point() +
scale_color_brewer(palette = "Set1")
#scale_colour_manual(
#values = c(AsstProf = "red", AssocProf = "blue", Prof = "black")
)
補充2:二分類顏色
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, color = displ < 5))
#依據(jù)displ變量是否大于5,分為兩類顏色
- 接下來舉一例:用性別分組的柱狀圖研究不同學術(shù)級別的人數(shù),并以此來探究下之前提到的position的三種設(shè)置的區(qū)別。(繪圖中用到了繪制多重圖的方法--
grid.arrange()的使用也是一個常用的技巧)
library(gridExtra)
p1 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="stack") + labs(title='position="stack"')
p2 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="dodge") + labs(title='position="dodge"')
p3 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="fill") + labs(title='position="fill"')
grid.arrange(p1, p2, p3, ncol=3)
如下圖,可看出:
(1)position="stack" 繪制堆疊分組條形圖;
(2)position="dodge" 繪制分組條形圖并排;
(3)position="fill" 繪制堆疊分組,高度相同,按比例解釋。

2、刻面圖
(1)特征:區(qū)別于上述分組圖,刻面圖是按分類因子分開繪制數(shù)張圖(幾個類別就畫幾張圖)
(2)函數(shù):刻面圖有專門的函數(shù)繪制,有以下4種--
-
facet_wrap(~var,ncol=n)設(shè)置多圖排成n列; -
facet_wrap(~var,nrow=n)設(shè)置多圖排成n行;
data(singer, package="lattice")
library(ggplot2)
ggplot(data=singer, aes(x=height)) +
geom_histogram() +
facet_wrap(~voice.part, nrow=4)
#分成4行排列

如果想把多圖排成一個單列/單行,以便于比較組間數(shù)據(jù)差異。(當然前面提到的連個函數(shù)也可以)
-
facet_grid(var~.)設(shè)置排成單列 -
facet_grid(.~var)設(shè)置排成單行
ggplot(data=singer, aes(x=height, fill=voice.part)) +
geom_density() +
facet_grid(voice.part~.)
#單列排布,利于比較觀察

如果有兩個分類變量var1、var2,分別有m、n類,可以用
facet_grid(var1~var2)函數(shù)繪制m*n個刻面圖。
五、自定義ggplot2圖形的外觀
1、坐標軸(p419)
主要針對兩類坐標軸:類別型與連續(xù)型
- 以x軸為例分別為
scale_x_discrete()、scale_x_continuous(); - 主要涉及兩個參數(shù)
breaks=、labels= -
scale_x_discrete()、scale_y_discrete()可用于修改x軸或y軸的刻度單位值(break=);修改刻度標簽(labels=)
關(guān)于后者labels= 比較好理解,就是我們看到坐標軸上的注釋性刻度標簽;
關(guān)于前者breaks=,是實際繪圖的參照軸刻度值。對于連續(xù)型變量,一般是從小到大的數(shù)值型向量;對于類別型變量,一般對應(yīng)實際數(shù)據(jù)分類因子字符向量。具體見下例
(1)原圖
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
labs(title="Faculty Salary by Rank and Sex", x="", y="")
#ggplot2默認情況下會數(shù)據(jù)添加標簽、圖例等。

(2)自定義標簽
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
labels=c("Assistant\na",
"Associate\nb",
"Full\nc")) +
scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
labels=c("$50K", "$100K", "$150K", "$200K")) +
labs(title="Faculty Salary by Rank and Sex", x="", y="")

注意如果想改變類別型變量在x軸上的分布次序,那么需要修改原數(shù)據(jù)該列的因子順序,對應(yīng)上例,即
Salaries$rank=factor(Salaries$rank,levels = c("Prof","AsstProf", "AssocProf")),再執(zhí)行上述操作,即可改變箱圖的順序。
補充:交換x、y軸
+ coord_flip()
2、圖例
自動生成的圖例都可以滿足大多數(shù)情況的需求。一般修改的話,即修改圖例的標題與位置。
(1)圖例標題在labs()函數(shù)的fill選項修改。本例中把sex改為了Gender。
(2)圖例位置通過theme()函數(shù)修改。本例中圖例位于距y軸10%,距x軸80%。
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
labs(title="Faculty Salary by Rank and Gender",
x="", y="", fill="Gender") +
theme(legend.position=c(.1,.8))
通過指定比例坐標信息,可以將圖例擺放在繪圖區(qū)域的特定位置。而ggplot默認將圖例放在圖的右側(cè)(四周外面)legend.position="left/top/bottom/right"
legend.positon = "none"則會取消圖例。

3、主題
-
theme_*()族函數(shù),來定制圖形中的非數(shù)據(jù)元素
ggplot2內(nèi)置的8種主題 - 如下示例對比
g1 <- ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(color = class))
g2 <- ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(color = class)) +
theme_classic()
library(gridExtra)
grid.arrange(g1, g2, ncol=2)

4、保存圖形
ggsave()函數(shù)
(1)保存指定圖形(plot、width、height)
myplot1 <- ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
labs(title="Faculty Salary by Rank and Gender",x="", y="")
ggsave(file="my01.png", plot=myplot1, width=5, height=4)
#保存尺寸為5英寸×4英寸,即12.7cm×10.2cm
(2)保存剛剛得到的圖形
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
labs(title="Faculty Salary by Rank and Gender",x="", y="")
ggsave(file="my02.png")
此外教材中還有三維氣泡圖,如何給分組觀測自定義顏色,以及主題的設(shè)置,詳見p422。以上是關(guān)于ggplot2函數(shù)基礎(chǔ)知識的學習。ggplot2的功能是很強大的,后續(xù)有機會再進行深入的探索與學習。
寒假關(guān)于R語言的學習可能就暫時到這一章節(jié)了,之后要刷學校的網(wǎng)課了,盼望能夠早日開學吧。
參考教材《R語言實戰(zhàn)(第2版)》
