R語言系列4:圖形初階

R語言系列4:圖形初階


此文內(nèi)容為《R語言實戰(zhàn)》的筆記,人民郵電出版社出版。

從高中電腦課學(xué)VB開始,大一課內(nèi)開始學(xué)習(xí)C++,到后來大二為了數(shù)模學(xué)習(xí)Matlab,到大三為了搞深度學(xué)習(xí)自學(xué)Python,到研究生之初學(xué)習(xí)Stata——選擇一門語言對我來說就像是小時候玩冒險島,到10級的時候是轉(zhuǎn)戰(zhàn)士好還是弓箭手好一般的糾結(jié)。我查閱了很多B乎的文章,最后覺得可能R比較合適現(xiàn)在的我。

作為從Python轉(zhuǎn)進(jìn)來R的新手,我把可能會用經(jīng)常需要用到或經(jīng)常需要查閱的代碼貼上來,主要是為了日后方便查找,就像“字典”一樣。推文的順序與教材不同,為了簡潔,我還會刪除一些我個人認(rèn)為不太重要的章節(jié)。我還會按照自己的學(xué)習(xí)進(jìn)度發(fā)布文章,請讀者見諒。

本文章僅供學(xué)習(xí)參考,請勿轉(zhuǎn)載,侵刪!


目錄

  • 3 圖形初階
    • 3.1 使用圖形
    • 3.2 一個簡單的例子
    • 3.3 圖形參數(shù)
      • 3.3.1 符號和線條
      • 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是一個經(jīng)驗的圖形構(gòu)建平臺。在通常的交互式繪畫中,你可以逐條輸入語句構(gòu)建圖形,逐漸完善圖形的特征,直至想要的結(jié)果。考慮下面的代碼:

attach(mtcars)
plot(wt, mpg)
abline(lm(mpg ~ wt))
title("Regression of MPG on Weight")
detach(mtcars)

圖中的散點、擬合線、標(biāo)題是逐個逐個被添加入圖中的。


3.2 一個簡單的例子

構(gòu)建一個數(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")

這個命令把dose作為x軸,drugA作為y軸,并使用樣式"b",更多的選項請見help(plot)。


3.3 圖形參數(shù)

我們可以通過修改稱為圖形參數(shù)的選項來自定義一幅圖形的多個特征(字體、顏色、坐標(biāo)軸、標(biāo)簽)。一方法是通過par()來指定這些選項。這種方式設(shè)定的參數(shù)值除非被再次修改,否則在會話結(jié)束前將一直有效。其調(diào)用格式為par(optionname=value, optionname=name,...)。請參考:

opar <- par(no.readonly = TRUE)
par(lty=2, pch=17)
plot(data$dose, data$drugA, type="b")
par(opar)

其中,我們使用lty改變了了線條的樣式;使用pch改變了點的形狀。請參考help(par)。你可以隨心所欲地多次使用par()函數(shù),即par(lty=2, pch=17)也可以寫成:

par(lty=2)
pch(pch=17)

你也可以直接在plot中為每一幅圖形單獨修改一個樣式,例如:

plot(data$dose, data$drugA, type="b", lty=2, pch=8)

下面介紹可以設(shè)定的許多重要的圖形參數(shù)。

3.3.1 符號和線條

你可以使用圖形參數(shù)指定符號和線條,如下所示:

== 參數(shù) ==        == 描述 ==
pch               繪圖符號
cex               符號大小
lty               線形
lwd               線寬

對于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)

對于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)

上面兩個圖的代碼不必細(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ù)同樣可以用來指定字號、字體和字樣。下標(biāo)闡釋了用于控制本文大小的參數(shù):

== 參數(shù) ==        == 描述 ==
cex               相對于默認(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=符號字體
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")
)

那么在后面需要用到字體的時候,就可以直接使用family=A來調(diào)用字體,例如:

par(family=A)

如果是macOS系統(tǒng),那么請用quartzFonts()

3.3.4 圖形尺寸與邊界尺寸

以下參數(shù)可以控制圖形尺寸和邊界尺寸:

== 參數(shù) ==        == 描述 ==
pin               以英寸表示的圖形尺寸(寬和高)
mai               以數(shù)值向量表示邊界大小(順序為下、左、上、右),單位為英寸
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英寸的圖形。

讓我們對這一節(jié)所學(xué)的知識強(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ù),許多高級繪圖函數(shù)(如plot, hist, boxplot)也允許自行定義坐標(biāo)軸和文本選項。比如以下代碼在圖形上添加來標(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ù)都支持這些選項。另外,從更精細(xì)的控制和模塊化的角度考慮,你可以使用本節(jié)余下部分描述的函數(shù)來控制標(biāo)題、坐標(biāo)軸、圖例和文本標(biāo)注的外觀。

某些高級繪圖函數(shù)會自動幫你添加默認(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)

請使用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)軸時,你應(yīng)該禁用高級繪圖函數(shù)自動生成的坐標(biāo)軸。參數(shù)axes=FALSE將禁用全部坐標(biāo)軸。參數(shù)xaxt="n"yaxt="n"將分別禁用x、y坐標(biāo)軸(但會留下框線,只是刪除了刻度)

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é)請參考help(legend)。下面給出一個畫圖的成品的代碼:

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()則向圖形的四個邊界之一添加文本,其格式為:

text(location, "texts", pos, ...)
mtext("texts", side, line=n, ...)

常見選項為:

== 選項 ==       == 描述 ==
location        c(x,y),也可以用locater(1)使用鼠標(biāo)點擊
pos             文本相對于點的位置,1=下、2=左、3=上、4=右
                  * 同時可以指定參數(shù)offset=偏移量
side            用來放置文本的邊,1=下、2=左、3=上、4=右
                  * 可以指定line=來內(nèi)移或外移文本
                  * 也可以使用sdj=0將文本左下對其或adj=1右上對齊

比如:

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)注

請參考help(plotmath)獲得更多細(xì)節(jié)。


3.5 圖形的組合

在R中使用函數(shù)par()layout()可以很容易第組合多個圖形為一幅圖。這兩個函數(shù)的使用場景并不相同,下面會分別講解。

你可以使用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是一個矩陣,它指定了所要組合的多個圖形的所在位置:

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()可以很方便地擺放圖的位置及其相對大小。所以如果只是圖形的簡單排列,我個人更傾向于使用layout(mat)方法。

如果需要對圖形布局進(jìn)行精確控制,那么可以使用par()更加方便,你可以使用其fit=參數(shù)完成這個任務(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ù)整個圖形的x的0-80%,y的0-80%的部分。置于兩個boxplot的占據(jù)位置,需要反復(fù)嘗試才能尋找到合適的(這是因為boxplot()會產(chǎn)生一個圖框,我們把圖框消掉以后它在圖中的具體位置是不知道的)。你可以使用axes=TRUE進(jìn)行實驗理解它。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容