R語言系列4:圖形初階
此文內(nèi)容為《R語言實(shí)戰(zhàn)》的筆記付鹿,人民郵電出版社出版涂乌。
從高中電腦課學(xué)VB開始催享,大一課內(nèi)開始學(xué)習(xí)C++靠欢,到后來大二為了數(shù)模學(xué)習(xí)Matlab廊敌,到大三為了搞深度學(xué)習(xí)自學(xué)Python,到研究生之初學(xué)習(xí)Stata——選擇一門語言對(duì)我來說就像是小時(shí)候玩冒險(xiǎn)島门怪,到10級(jí)的時(shí)候是轉(zhuǎn)戰(zhàn)士好還是弓箭手好一般的糾結(jié)骡澈。我查閱了很多B乎的文章,最后覺得可能R比較合適現(xiàn)在的我薪缆。
作為從Python轉(zhuǎn)進(jìn)來R的新手秧廉,我把可能會(huì)用經(jīng)常需要用到或經(jīng)常需要查閱的代碼貼上來伞广,主要是為了日后方便查找,就像“字典”一樣疼电。推文的順序與教材不同嚼锄,為了簡潔,我還會(huì)刪除一些我個(gè)人認(rèn)為不太重要的章節(jié)蔽豺。我還會(huì)按照自己的學(xué)習(xí)進(jìn)度發(fā)布文章区丑,請(qǐng)讀者見諒。
本文章僅供學(xué)習(xí)參考修陡,請(qǐng)勿轉(zhuǎn)載沧侥,侵刪!
目錄
-
3 圖形初階
- 3.1 使用圖形
- 3.2 一個(gè)簡單的例子
-
3.3 圖形參數(shù)
- 3.3.1 符號(hào)和線條
- 3.3.2 顏色
- 3.3.3 文本屬性
- 3.3.4 圖形尺寸與邊界尺寸
-
3.4 添加文本魄鸦、自定義坐標(biāo)軸和圖例
- 3.4.1 標(biāo)題
- 3.4.2 坐標(biāo)軸
- 3.4.3 參考線
- 3.4.4 圖例
- 3.4.5 文本標(biāo)注
- 3.4.6 數(shù)學(xué)標(biāo)注
- 3.4 圖形的組合
第3章 圖形初階(非ggplot2)
3.1 使用圖形
R是一個(gè)經(jīng)驗(yàn)的圖形構(gòu)建平臺(tái)宴杀。在通常的交互式繪畫中,你可以逐條輸入語句構(gòu)建圖形拾因,逐漸完善圖形的特征旺罢,直至想要的結(jié)果【罴牵考慮下面的代碼:
attach(mtcars)
plot(wt, mpg)
abline(lm(mpg ~ wt))
title("Regression of MPG on Weight")
detach(mtcars)
圖中的散點(diǎn)扁达、擬合線、標(biāo)題是逐個(gè)逐個(gè)被添加入圖中的蠢熄。
3.2 一個(gè)簡單的例子
構(gòu)建一個(gè)數(shù)據(jù)集:
dose <- c(20,30,40,45,60)
drugA <- c(16,20,27,40,60)
drugB <- c(15,18,25,31,40)
data <- data.frame(dose, drugA, drugB)
data
## dose drugA drugB
## 1 20 16 15
## 2 30 20 18
## 3 40 27 25
## 4 45 40 31
## 5 60 60 40
用下面的代碼可以創(chuàng)建一幅描述藥物A的劑量和響應(yīng)的關(guān)系圖:
plot(data$dose, data$drugA, type="b")
這個(gè)命令把dose
作為x軸跪解,drugA
作為y軸,并使用樣式"b"
签孔,更多的選項(xiàng)請(qǐng)見help(plot)
叉讥。
3.3 圖形參數(shù)
我們可以通過修改稱為圖形參數(shù)的選項(xiàng)來自定義一幅圖形的多個(gè)特征(字體、顏色饥追、坐標(biāo)軸节吮、標(biāo)簽)。一方法是通過par()
來指定這些選項(xiàng)判耕。這種方式設(shè)定的參數(shù)值除非被再次修改,否則在會(huì)話結(jié)束前將一直有效翘骂。其調(diào)用格式為par(optionname=value, optionname=name,...)
壁熄。請(qǐng)參考:
opar <- par(no.readonly = TRUE)
par(lty=2, pch=17)
plot(data$dose, data$drugA, type="b")
par(opar)
其中,我們使用lty
改變了了線條的樣式碳竟;使用pch
改變了點(diǎn)的形狀草丧。請(qǐng)參考help(par)
。你可以隨心所欲地多次使用par()
函數(shù)莹桅,即par(lty=2, pch=17)
也可以寫成:
par(lty=2)
pch(pch=17)
你也可以直接在plot
中為每一幅圖形單獨(dú)修改一個(gè)樣式昌执,例如:
plot(data$dose, data$drugA, type="b", lty=2, pch=8)
下面介紹可以設(shè)定的許多重要的圖形參數(shù)烛亦。
3.3.1 符號(hào)和線條
你可以使用圖形參數(shù)指定符號(hào)和線條,如下所示:
== 參數(shù) == == 描述 ==
pch 繪圖符號(hào)
cex 符號(hào)大小
lty 線形
lwd 線寬
對(duì)于pch=
參數(shù)懂拾,你可以使用如下的值:
plot(0, 5, pch=0, xlim=c(-1,6), ylim=c(0,6), xlab="", ylab="", xaxt="n", yaxt="n")
text(0, 5, "0", pos=2)
index =1
for (i in 5:1){
for (j in 1:5){
points(j, i, pch=index)
text(j, i, as.character(index), pos=2)
index <- index + 1
}
}
text(2.7, 5.7, "pch=", cex=1.3)
對(duì)于lty=
參數(shù)煤禽,你可以使用如下的值:
plot(c(1,5), c(1,1), type="b",
lty=1, pch=20,
xlim=c(0,6), ylim=c(0,7),
xlab="", ylab="",
xaxt="n", yaxt="n")
text(1, 1, "1", pos=2)
for (i in 2:6){
lines(c(1,5), c(i,i), type="b", lty=i, pch=20)
text(1, i, as.character(i), pos=2)
}
text(2.85, 6.7, "lty=", cex=1.3)
上面兩個(gè)圖的代碼不必細(xì)究,看完后面的就懂了岖赋。
3.3.2 顏色
R中有若干和顏色相關(guān)的參數(shù)檬果,例如:
== 參數(shù) == == 描述 ==
col 默認(rèn)的繪圖顏色
col.axis 坐標(biāo)軸刻度文字的顏色
col.lab 坐標(biāo)軸名稱的顏色
col.main 標(biāo)題顏色
col.sub 副標(biāo)題的顏色
fg 圖形的前景色
bg 圖形的背景色
在R中,可以通過顏色下標(biāo)唐断、顏色名稱选脊、16進(jìn)制顏色值、RGB值或HSV值指定顏色脸甘。比如:
col=1
col="white"
col="#FFFFFF"
col=rgb(1,1,1)
col=hsv(0,0,1)
都表示白色恳啥。函數(shù)colors()
可以返回可用顏色的名稱:
colors()
3.3.3 文本屬性
圖形參數(shù)同樣可以用來指定字號(hào)、字體和字樣丹诀。下標(biāo)闡釋了用于控制本文大小的參數(shù):
== 參數(shù) == == 描述 ==
cex 相對(duì)于默認(rèn)大小的放大縮小倍數(shù)
cex.axis 坐標(biāo)軸刻度文字的縮放倍數(shù)
cex.lab 坐標(biāo)軸標(biāo)簽的縮放倍數(shù)
cex.main 標(biāo)題的縮放倍數(shù)
cex.sub 副標(biāo)題的縮放倍數(shù)
font 1=常規(guī)钝的,2=粗體,3=斜體忿墅,4=斜粗體扁藕,5=符號(hào)字體
font.axis 坐標(biāo)軸刻度的文字樣式
font.lab 坐標(biāo)軸標(biāo)簽的樣式
font.main 標(biāo)題的字體樣式
font.sub 副標(biāo)題的字體樣式
ps 字體磅值
family 使用的字體族
距離來說,如果執(zhí)行語句
par(font.lab=3, cex.lab=1.5, font.main=4, cex.main=2)
那么之后創(chuàng)建的圖形都擁有斜體疚脐、1.5倍于默認(rèn)大小的坐標(biāo)軸標(biāo)簽亿柑,以及粗體、2倍于默認(rèn)大小的標(biāo)題棍弄。
我們還可以簡單的設(shè)置字體望薄。比如,在windows中呼畸,運(yùn)行:
windowsFonts(
A = windowsFont("Arial Black")
B = windowsFont("Bookman Old Style")
)
那么在后面需要用到字體的時(shí)候痕支,就可以直接使用family=A
來調(diào)用字體,例如:
par(family=A)
如果是macOS系統(tǒng)蛮原,那么請(qǐng)用quartzFonts()
3.3.4 圖形尺寸與邊界尺寸
以下參數(shù)可以控制圖形尺寸和邊界尺寸:
== 參數(shù) == == 描述 ==
pin 以英寸表示的圖形尺寸(寬和高)
mai 以數(shù)值向量表示邊界大形孕搿(順序?yàn)橄隆⒆笕逶伞⑸匣ㄋ弧⒂遥瑔挝粸橛⒋?mar 同上蹦漠,單位為英分椭员。默認(rèn)值為 c(5,4,4,2)+.1
比如,代碼:
par(pin=c(4,3), mai=c(1, .5, 1, .2))
可以生成一幅4英寸寬笛园、3英寸高隘击、上下邊界為1英寸侍芝、坐邊界為.5英寸、由邊界為.2英寸的圖形埋同。
讓我們對(duì)這一節(jié)所學(xué)的知識(shí)強(qiáng)化之前的簡單圖例:
opar <- par(no.readonly = TRUE)
par(pin=c(2, 3))
par(lwd=1, cex=.75)
par(cex.axis=.75, font.axis=3)
plot(data$dose, data$drugA, type="b", pch=19, lty=2, col="red")
3.4 添加文本州叠、自定義坐標(biāo)軸和圖例
除了圖形參數(shù),許多高級(jí)繪圖函數(shù)(如plot, hist, boxplot)也允許自行定義坐標(biāo)軸和文本選項(xiàng)莺禁。比如以下代碼在圖形上添加來標(biāo)題(main)留量、副標(biāo)題(sub)、坐標(biāo)軸標(biāo)簽(xlab哟冬、ylab)并制定了坐標(biāo)軸范圍(xlim楼熄、ylim):
plot(data$dose, data$drugA, type="b",
col='blue', lty=2, pch=2, lwd=1,
main="Clinical Trials for Drug A",
sub="This is a hypothetical data",
xlab="Dosage", ylab="Drug Response",
xlim=c(0, 60), ylim=c(0, 70))
再次提醒,并非所有函數(shù)都支持這些選項(xiàng)浩峡。另外可岂,從更精細(xì)的控制和模塊化的角度考慮,你可以使用本節(jié)余下部分描述的函數(shù)來控制標(biāo)題翰灾、坐標(biāo)軸缕粹、圖例和文本標(biāo)注的外觀。
某些高級(jí)繪圖函數(shù)會(huì)自動(dòng)幫你添加默認(rèn)的標(biāo)題和標(biāo)簽纸淮,你可以在
plot()
或par()
中使用ann=FALSE
來移除它們
3.4.1 標(biāo)題
可以使用title()
函數(shù)為圖形添加標(biāo)題和坐標(biāo)軸標(biāo)簽平斩,其格式為:
title(main = "main title",
sub = "subtitle",
xlab = "x-axis label",
ylab = "y-axis label")
函數(shù)title()
中也可以指定其他圖形參數(shù)(如文本大小、字體咽块、旋轉(zhuǎn)角度和顏色)绘面。比如:
title(main = "main title",
sub = "subtitle",
xlab = "x-axis label",
ylab = "y-axis label",
col.lab="green", cex.lab=.75)
請(qǐng)使用help
查看更多細(xì)節(jié)。
3.4.2 坐標(biāo)軸
你可以使用函數(shù)axis()
來創(chuàng)建自定義的坐標(biāo)軸侈沪,而非使用R中的默認(rèn)坐標(biāo)軸揭璃,其格式為:
axis(side, at=, labels=, pos=, las=, tck=, ...)
常用的參數(shù)用:
== 參數(shù) == == 描述 ==
side 表示圖形的哪邊繪制坐標(biāo)軸(1=下、2=左亭罪、3=上瘦馍、4=右)
at 數(shù)值型向量,表示需要繪制刻度線的位置
labels 字符型向量应役,表示置于刻度線旁邊的問題標(biāo)簽(如果缺省情组,就是at中的)
pos 坐標(biāo)軸線繪制位置的坐標(biāo)
lty 線條類型
col 線條和刻度線的顏色
las 標(biāo)簽是否平行于(=0)或垂直于(=2)坐標(biāo)軸
tck 刻度線的長度
(...) 其他參數(shù)
自定義創(chuàng)建坐標(biāo)軸時(shí),你應(yīng)該禁用高級(jí)繪圖函數(shù)自動(dòng)生成的坐標(biāo)軸箩祥。參數(shù)axes=FALSE
將禁用全部坐標(biāo)軸呻惕。參數(shù)xaxt="n"
和yaxt="n"
將分別禁用x、y坐標(biāo)軸(但會(huì)留下框線滥比,只是刪除了刻度)
3.4.3 參考線
函數(shù)abline()
可以用于為圖添加參考線,格式為:
abline(h=yvalues, v=xvalues)
此函數(shù)的參數(shù)也可以用于指定其他圖形參數(shù)做院,例如:
abline(v=seq(1, 10, 2), lty=2, col="blue")
表示在1盲泛、3濒持、5、7寺滚、9的位置添加了垂直的藍(lán)色虛線柑营。
3.4.4 圖例
可以使用legend()
來添加圖例,其格式為:
legend(location, title, legend, ...)
更多細(xì)節(jié)請(qǐng)參考help(legend)
村视。下面給出一個(gè)畫圖的成品的代碼:
dose <- c(20,30,40,45,60)
drugA <- c(16,20,27,40,60)
drugB <- c(15,18,25,31,40)
opar <- par(no.readonly = TRUE)
par(lwd=2, cex=.75, font.lab=2)
plot(dose, drugA, type="b",
pch=15, lty=1, col="red",
ylim=c(0, 60),
main="Drug A vs. Drug B",
xlab="Drug Dosage", ylab="Drug Response")
lines(dose, drugB, type="b",
pch=17, lty=2, col="blue")
abline(h=c(30), lwd=1.5, lty=2, col="gray")
legend("topleft", inset=.05, title="Drug Type", c("A", "B"),
lty=c(1,2), pch=c(15,17), col=c("red", "blue"))
3.4.5 文本標(biāo)注
可以通過函數(shù)text()
和mtext()
將文本添加到圖形上官套。text()
可以向繪圖區(qū)域內(nèi)部添加文本,而mtext()
則向圖形的四個(gè)邊界之一添加文本蚁孔,其格式為:
text(location, "texts", pos, ...)
mtext("texts", side, line=n, ...)
常見選項(xiàng)為:
== 選項(xiàng) == == 描述 ==
location c(x,y)奶赔,也可以用locater(1)使用鼠標(biāo)點(diǎn)擊
pos 文本相對(duì)于點(diǎn)的位置,1=下杠氢、2=左站刑、3=上、4=右
* 同時(shí)可以指定參數(shù)offset=偏移量
side 用來放置文本的邊鼻百,1=下绞旅、2=左、3=上温艇、4=右
* 可以指定line=來內(nèi)移或外移文本
* 也可以使用sdj=0將文本左下對(duì)其或adj=1右上對(duì)齊
比如:
attach(mtcars)
plot(wt, mpg,
main="Mileage vs. Car Weight",
xlab="Weight", ylab="Mileage",
pch=18, col="blue")
text(wt, mpg,
row.names(mtcars),
cex=.6, pos=4, col="red")
又比如:
opar <- par(no.readonly = TRUE)
par(cex=1.5)
plot(1:7, 1:7, type="n", xaxt="n", yaxt="n", xlab="", ylab="")
text(3, 3, "Example of defalut text")
text(2, 2, family="STSong", "華文宋體")
text(4, 4, family="mono", "Example of moni-spaced text")
text(5, 5, family="serif", "Example of serif text")
text(4, 6, family="TimesNewRomanPSMT", "Example of Times New Roman text")
3.4.6 數(shù)學(xué)標(biāo)注
請(qǐng)參考help(plotmath)
獲得更多細(xì)節(jié)因悲。
3.5 圖形的組合
在R中使用函數(shù)par()
或layout()
可以很容易第組合多個(gè)圖形為一幅圖。這兩個(gè)函數(shù)的使用場(chǎng)景并不相同勺爱,下面會(huì)分別講解晃琳。
你可以使用par()
函數(shù)的mfrow=c(nrows, ncols)
來創(chuàng)建按行填充的圖形矩陣,例如:
attach(mtcars)
par(mfrow=c(2,2))
plot(wt, mpg, main="Scatterplot of wt vs. mpg")
plot(wt, disp, main="Scatterplot of wt vs. disp")
hist(wt, main="Historam of wt")
boxplot(wt, main="Boxplot of wt")
你也可以使用layout(mat)
方法邻寿,其中mat
是一個(gè)矩陣蝎土,它指定了所要組合的多個(gè)圖形的所在位置:
attach(mtcars)
layout(matrix(c(1,2,3,3), nrow = 2))
plot(wt, mpg, main="Scatterplot of wt vs. mpg")
plot(wt, disp, main="Scatterplot of wt vs. disp")
hist(wt, main="Historam of wt")
layout()
還可以指定圖形的高度和寬度,見:
attach(mtcars)
layout(matrix(c(1,1,2,3), nrow = 2, byrow = TRUE),
widths=c(3, 1), heights=c(1, 2))
hist(wt)
hist(mpg)
hist(disp)
上面的代碼指定了绣否,第一行的高度:第二行的高度=1:2誊涯。左圖的寬度:右圖的寬度=3:1。
可見蒜撮,layout()
可以很方便地?cái)[放圖的位置及其相對(duì)大小暴构。所以如果只是圖形的簡單排列,我個(gè)人更傾向于使用layout(mat)
方法段磨。
如果需要對(duì)圖形布局進(jìn)行精確控制取逾,那么可以使用par()
更加方便,你可以使用其fit=
參數(shù)完成這個(gè)任務(wù)苹支。例如:
par(fig=c(0, .8, 0, .8))
plot(mtcars$wt, mtcars$mpg,
xlab="Miles Per Gallon",
ylab="Car Weight")
par(fig=c(0, .8, .4, 1), new=TRUE)
boxplot(mtcars$wt, horizontal = TRUE, axes=FALSE)
par(fig=c(.6, 1, 0, .8), new=TRUE)
boxplot(mtcars$mpg, axes=FALSE)
mtext("Enhanced Scatterplot", side=3, outer=TRUE, line=-3)
fig=c(0, .8, 0, .8)
的意思是砾隅,下面這張圖,將占據(jù)整個(gè)圖形的x的0-80%债蜜,y的0-80%的部分晴埂。置于兩個(gè)boxplot的占據(jù)位置究反,需要反復(fù)嘗試才能尋找到合適的(這是因?yàn)閎oxplot()會(huì)產(chǎn)生一個(gè)圖框,我們把圖框消掉以后它在圖中的具體位置是不知道的)儒洛。你可以使用axes=TRUE
進(jìn)行實(shí)驗(yàn)理解它精耐。