R語言系列4:圖形初階

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)理解它精耐。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市琅锻,隨后出現(xiàn)的幾起案子卦停,更是在濱河造成了極大的恐慌,老刑警劉巖恼蓬,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惊完,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡滚秩,警方通過查閱死者的電腦和手機(jī)专执,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郁油,“玉大人本股,你說我怎么就攤上這事⊥╇纾” “怎么了拄显?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長案站。 經(jīng)常有香客問我躬审,道長,這世上最難降的妖魔是什么蟆盐? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任承边,我火速辦了婚禮,結(jié)果婚禮上石挂,老公的妹妹穿的比我還像新娘博助。我一直安慰自己,他們只是感情好痹愚,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布富岳。 她就那樣靜靜地躺著,像睡著了一般拯腮。 火紅的嫁衣襯著肌膚如雪窖式。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天动壤,我揣著相機(jī)與錄音萝喘,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜒灰,可吹牛的內(nèi)容都是我干的弦蹂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼强窖,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了削祈?” 一聲冷哼從身側(cè)響起翅溺,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎髓抑,沒想到半個(gè)月后咙崎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吨拍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年褪猛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羹饰。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伊滋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出队秩,到底是詐尸還是另有隱情笑旺,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布馍资,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏削彬。R本人自食惡果不足惜森书,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望建钥。 院中可真熱鬧,春花似錦锦针、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馋吗。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脚翘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工来农, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沃于。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像繁莹,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咨演,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345