之前學(xué)習(xí)的繪圖方法是基于R的基礎(chǔ)繪圖系統(tǒng)鲁沥。在R中一共有四種作圖系統(tǒng)堤魁,分別為base(之前學(xué)的)、grid铐姚、lattice策肝,以及ggplot2。其中g(shù)gplot2包的目標(biāo)是提供一個(gè)全面的隐绵、基于語(yǔ)法的之众,連貫一致的圖形生成系統(tǒng),允許用戶創(chuàng)建新穎的依许、有創(chuàng)新性的數(shù)據(jù)可視化圖形棺禾。關(guān)于另外兩種的介紹,見p402峭跳。
一膘婶、預(yù)準(zhǔn)備
1、安裝加載包
不像基礎(chǔ)繪圖方法可以直接使用蛀醉,ggplot2包第一次使用要安裝悬襟、加載。
install.packages("ggplot2")
library(ggplot2)
2滞欠、加載實(shí)驗(yàn)數(shù)據(jù)
(1)mtcars數(shù)據(jù)集包括32輛車的詳細(xì)信息古胆。
data(mtcars)
(2)singer數(shù)據(jù)集來(lái)自lattice包,包括某合唱團(tuán)的身高與聲音變量
data(singer, package="lattice")
#lattice包已在基礎(chǔ)安裝里
(3)Salaries數(shù)據(jù)集來(lái)自carData包(教材說(shuō)是來(lái)自car包筛璧,可能是最近移動(dòng)了)逸绎,其包含了大學(xué)教授的收入信息,以及其它相關(guān)因素(級(jí)別夭谤、性別)棺牧。
install.packages("carData")
data(Salaries, package="carData")
二、基礎(chǔ)用法
一個(gè)簡(jiǎn)單例子
ggplot(mtcars, aes(x=wt, y=mpg)) +
geom_point() +
labs(title="Automobile Data", x="Weight", y="Miles Per Gallon")
如上一個(gè)簡(jiǎn)單的ggplot繪圖包括主要有以下三方面內(nèi)容朗儒,用加號(hào)(+)相連組成的:
1颊乘、ggplot()函數(shù)
:用于交代繪圖的數(shù)據(jù)來(lái)源,并指定要使用的變量信息醉锄。其中的aes()即用來(lái)指定繪圖涉及到的變量乏悄,及每個(gè)變量扮演的角色,有時(shí)也包括分組信息恳不。
2檩小、geom_ 幾何函數(shù)
:指明視覺呈現(xiàn)方式(在我理解就是繪圖類型);一張圖里可以有多個(gè)幾何函數(shù)呈現(xiàn)烟勋,即使用多個(gè)geom類型函數(shù)规求。
3筐付、lab()函數(shù)
:主要用于添加注釋信息(標(biāo)題等)。部分常用參數(shù)如下
-
title =
添加主標(biāo)題阻肿;subtitle =
添加副標(biāo)題瓦戚,位于主標(biāo)題下面,字體更小丛塌。 -
caption =
在圖形右下角添加文本较解,常用于描述數(shù)據(jù)來(lái)源。 -
x =
與y =
修改坐標(biāo)軸標(biāo)題姨伤,colour =
修改圖例標(biāo)題
ggplot()函數(shù)中的變量選擇要根據(jù)自己想要繪制什么樣的圖來(lái)研究什么樣的變量關(guān)系來(lái)決定哨坪。
補(bǔ)充:關(guān)于ggplot的繪圖變量交代也可放在每個(gè)具體的繪圖函數(shù)中庸疾,ggplot()僅交代下數(shù)據(jù)來(lái)源乍楚。比如
ggplot(data = mpg) +
geom_point(aes(x = displ, y = hwy))
# 如果只使用ggplot(data = mpg)只會(huì)得到灰色背景
三、關(guān)于geom函數(shù)
1届慈、geom類型
目前一共有37個(gè)幾何函數(shù)可供使用徒溪,教材中列了常見的13種以及所涉及到的參數(shù)選項(xiàng)(p407)。比如
-
geom_bar()
表示條形圖金顿,涉及選項(xiàng)有color臊泌、fill、alpha揍拆; -
geom_boxplot()
表示箱線圖渠概,涉及選項(xiàng)有color、fill嫂拴、alpha播揪、notch、width筒狠; -
geom_histogram()
表示直方圖猪狈,涉及選項(xiàng)有color、fill辩恼、alpha雇庙、linetype、binwidth灶伊; -
geom_point()
表示散點(diǎn)圖疆前,涉及選項(xiàng)有color、alpha聘萨、shape竹椒、size; -
geom_rug()
表示地毯圖匈挖,涉及選項(xiàng)有color碾牌、size康愤。
2、常見選項(xiàng)(詳見p408)
- fill 用于設(shè)置填充區(qū)域顏色舶吗;
- color 用于設(shè)置點(diǎn)征冷、線,邊界的顏色誓琼;
- alpha 設(shè)置顏色透明度检激,1不透明;0透明腹侣;
- linetype 設(shè)置線條類型叔收;
- shape 設(shè)置點(diǎn)的形狀;
- position 參數(shù)對(duì)于點(diǎn)圖來(lái)說(shuō) jitter 減少點(diǎn)重疊傲隶;對(duì)條形圖而言有 dodge饺律、stacked、fill三種模式(具體在例子中說(shuō)明)跺株。
例圖:三圖綜合
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")
如圖為箱線圖复濒、點(diǎn)圖,地毯圖的混合圖乒省。
(1)對(duì)箱線圖設(shè)置了填充顏色巧颈、邊界和點(diǎn)的顏色,以及方塊缺口袖扛;
(2)對(duì)點(diǎn)圖設(shè)置了隨機(jī)抖動(dòng)(否則點(diǎn)就排成一列砸泛,難以觀察)、點(diǎn)的顏色蛆封、點(diǎn)的透明度唇礁;
(3)對(duì)地毯圖設(shè)置了出現(xiàn)位置,以及線的顏色娶吞。
舉例-1:geom_smooth添加光滑曲線
除了上述提到的幾何函數(shù)類型垒迂,還有一種比較常見的函數(shù):為散點(diǎn)圖添加平滑曲線geom_smooth。其涉及到的參數(shù)有--(詳見p416)一般直接選默認(rèn)參數(shù)妒蛇。
-
method=
設(shè)置使用的平滑函數(shù)机断,默認(rèn)為smooth的非參數(shù)光滑曲線;此外還可選lm(線性)绣夺、glm(廣義線性)吏奸、rlm(穩(wěn)健線性)、gam(廣義相加)陶耍。 -
formula=
設(shè)置光滑函數(shù)公式奋蔚,默認(rèn)為y~x;如果是n次多項(xiàng)式,y~poly(x,n) -
se
設(shè)置置信區(qū)間泊碑,默認(rèn)TRUE坤按。 -
level
設(shè)置置信水平,默認(rèn)95%
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
geom_smooth() + geom_point()
#直接使用默認(rèn)參數(shù)
- 如上圖臭脓,散點(diǎn)的線性關(guān)系不是很明顯。因此可以擬合一個(gè)二次多項(xiàng)式的回歸的有參模型腹忽。
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
geom_smooth(method=lm, formula=y~poly(x,2),
se=FALSE, size=1) + #設(shè)置多項(xiàng)式擬合来累,并取消了置信區(qū)間
geom_point(size=2)
四、分組與刻面
繪圖時(shí)窘奏,若存在一個(gè)/多個(gè)分類變量可以就分組關(guān)系將圖分類嘹锁,以研究分類變量對(duì)數(shù)據(jù)的分布影響。例如將全校的成績(jī)按各個(gè)班級(jí)角度來(lái)看着裹。
1领猾、分組
(1)特征:不同組的分類變量繪制在一張圖里。
(2)書寫格式:在aes()函數(shù)中指明用來(lái)區(qū)分分類變量的方法即可(比如顏色求冷、符號(hào)形狀等)瘤运;比如下例中的color=rank
窍霞,左邊為區(qū)分方式(顏色)匠题、右邊為分類變量(等級(jí))。其它的分組依據(jù)還有:size =
但金、alpha =
韭山、shape =
ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank)) +
geom_point()
這里繪制畢業(yè)年數(shù)與收入的關(guān)系,并想研究學(xué)術(shù)級(jí)別對(duì)其分布的影響
補(bǔ)充1:分組顏色方案是ggplot2默認(rèn)的钱磅,也可以選擇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")
)
補(bǔ)充2:二分類顏色
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, color = displ < 5))
#依據(jù)displ變量是否大于5盖淡,分為兩類顏色
- 接下來(lái)舉一例:用性別分組的柱狀圖研究不同學(xué)術(shù)級(jí)別的人數(shù),并以此來(lái)探究下之前提到的position的三種設(shè)置的區(qū)別凿歼。(繪圖中用到了繪制多重圖的方法--
grid.arrange()
的使用也是一個(gè)常用的技巧)
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ù)張圖(幾個(gè)類別就畫幾張圖)
(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行排列
如果想把多圖排成一個(gè)單列/單行,以便于比較組間數(shù)據(jù)差異狠持。(當(dāng)然前面提到的連個(gè)函數(shù)也可以)
-
facet_grid(var~.)
設(shè)置排成單列 -
facet_grid(.~var)
設(shè)置排成單行
ggplot(data=singer, aes(x=height, fill=voice.part)) +
geom_density() +
facet_grid(voice.part~.)
#單列排布土童,利于比較觀察
如果有兩個(gè)分類變量var1、var2工坊,分別有m献汗、n類,可以用
facet_grid(var1~var2)
函數(shù)繪制m*n個(gè)刻面圖王污。
五罢吃、自定義ggplot2圖形的外觀
1、坐標(biāo)軸(p419)
主要針對(duì)兩類坐標(biāo)軸:類別型與連續(xù)型
- 以x軸為例分別為
scale_x_discrete()
昭齐、scale_x_continuous()
; - 主要涉及兩個(gè)參數(shù)
breaks=
尿招、labels=
-
scale_x_discrete()
、scale_y_discrete()
可用于修改x軸或y軸的刻度單位值(break=)阱驾;修改刻度標(biāo)簽(labels=)
關(guān)于后者labels= 比較好理解就谜,就是我們看到坐標(biāo)軸上的注釋性刻度標(biāo)簽;
關(guān)于前者breaks=里覆,是實(shí)際繪圖的參照軸刻度值丧荐。對(duì)于連續(xù)型變量,一般是從小到大的數(shù)值型向量喧枷;對(duì)于類別型變量虹统,一般對(duì)應(yīng)實(shí)際數(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默認(rèn)情況下會(huì)數(shù)據(jù)添加標(biāo)簽隧甚、圖例等车荔。
(2)自定義標(biāo)簽
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ù)該列的因子順序戚扳,對(duì)應(yīng)上例忧便,即
Salaries$rank=factor(Salaries$rank,levels = c("Prof","AsstProf", "AssocProf"))
,再執(zhí)行上述操作帽借,即可改變箱圖的順序珠增。
補(bǔ)充:交換x、y軸
+ coord_flip()
2宜雀、圖例
自動(dòng)生成的圖例都可以滿足大多數(shù)情況的需求切平。一般修改的話,即修改圖例的標(biāo)題與位置辐董。
(1)圖例標(biāo)題在labs()
函數(shù)的fill選項(xiàng)修改悴品。本例中把sex改為了Gender。
(2)圖例位置通過(guò)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))
通過(guò)指定比例坐標(biāo)信息,可以將圖例擺放在繪圖區(qū)域的特定位置届氢。而ggplot默認(rèn)將圖例放在圖的右側(cè)(四周外面)legend.position="left/top/bottom/right"
legend.positon = "none"
則會(huì)取消圖例欠窒。
3、主題
-
theme_*()族函數(shù)退子,來(lái)定制圖形中的非數(shù)據(jù)元素
ggplot2內(nèi)置的8種主題 - 如下示例對(duì)比
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")
此外教材中還有三維氣泡圖,如何給分組觀測(cè)自定義顏色丸凭,以及主題的設(shè)置福扬,詳見p422。以上是關(guān)于ggplot2函數(shù)基礎(chǔ)知識(shí)的學(xué)習(xí)惜犀。ggplot2的功能是很強(qiáng)大的铛碑,后續(xù)有機(jī)會(huì)再進(jìn)行深入的探索與學(xué)習(xí)。
寒假關(guān)于R語(yǔ)言的學(xué)習(xí)可能就暫時(shí)到這一章節(jié)了虽界,之后要刷學(xué)校的網(wǎng)課了汽烦,盼望能夠早日開學(xué)吧。
參考教材《R語(yǔ)言實(shí)戰(zhàn)(第2版)》