R語言學習2:繪圖


本系列是一個新的系列,在此系列中,我將和大家共同學習R語言。由於我對R語言的了解也甚少,所以本系列更多以一個學習者的視角來完成。

參考教材:《R語言實戰》第二版(Robert I.Kabacoff),書中所提到的John Cook的優秀博文,關於代碼規范的《來自Google的R語言編碼風格指南》。

Part 1:圖形參數

Unit 1:點型和線型

plot()是R中為對象作圖的一個泛型函數,它的輸出由所繪制對象的類型不同而不同。如果xy是兩個等長的數字向量,則以下代碼將繪制點集\((x,y)\),並用線段將其連接。

plot(x, y, type="b")

這里type="b"代表同時繪制點和線。還有以下的幾種type屬性的選擇:

  • "p":只繪制點,不繪制線段。
  • "l":只繪制線段,不繪制點。
  • "b":繪制點和線,但實線不通過點。
  • "o":繪制點和線,且實線會通過點,與"b"的視覺效果不同。
  • "h":只繪制各點到\(x\)軸的豎線,不繪制點和線。
  • "s":繪制階梯型曲線。
  • "S":繪制階梯型區間,但是階梯方向不同。
  • "n":不繪制任何點、線。

在使用plot()作圖之前,可以使用par()函數修改圖形的參數,這個函數可以任意次調用。在使用par()修改圖形參數之前,往往會加入以下兩句:

opar <- par(no.readonly=TRUE)
...
par(opar)

當調用par(opar)后,將還原默認參數環境

以下是用於指定符號和線條類型的參數:

  • pch:指定繪制點時使用的符號,范圍是\(\{0,1,\cdots,25\}\)
  • cex:指定符號的大小,表示繪圖符號相對於默認大小的縮放倍數,默認值是1。
  • lty:指定線條類型,范圍是\(\{1,2,\cdots,6\}\)
  • lwd:指定線條寬度,表示之於默認值的相對粗細,默認值是1。
image-20210209232858753

也可以直接在plot處加上這四個參數:

plot(x, y, type="b", pch=11, lty=2, cex=2, lwd=2)

Unit 2:顏色

以下是用於指定顏色的參數:

  • col:默認的繪圖顏色,可以傳入一個向量並循環使用。
  • col.axis:坐標軸刻度文字的顏色。
  • col.lab:坐標軸標簽文字的顏色。
  • col.main:標題顏色。
  • col.sub:副標題顏色。
  • fg:圖形前景色,如坐標軸線。
  • bg:圖形背景色。

顏色的指定,可以用顏色下標、顏色名字、十六進制顏色值、RGB值、HSV值來指定,函數colors()可以返回所有可用顏色的名稱(657種)。

可以用rainbow(n)創建一個\(n\)種連續的彩虹形顏色列表,可以用gray(vector)來獲得一個灰度色列表,常用的vector=0:n/n,是一個\([0,1]\)之間的均勻列表。

RColorBrewer是一個用於創建顏色的常用包,其中brewer.pal(n, name)可以從調色盤name中創建一個顏色值的向量,以下程序段是一個brewer.par()函數的使用示例。

library(RColorBrewer)
n <- 9
mycolor <- brewer.pal(n, "Set1")  # 使用的顏色集合是"Set1"
barplot(rep(1,n), col = mycolor)

可以使用display.brewer.all()顯示所有調色板的顏色,或者display.brewer.pal(name)顯示某個調色板的顏色。brewer.pal.info命令可以給出所有調色板的列表。

Unit 3:文本

字體族和字樣通過以下參數進行控制。

  • cex:相對默認大小的縮放倍數,默認值是1(代表以下一類,不要直接調用)。
  • cex.axis:坐標軸刻度文字的縮放倍數。
  • cex.lab:坐標軸標簽的縮放倍數。
  • cex.main:標題的縮放倍數。
  • cex.sub:副標題的縮放倍數。
  • font:整數,指定字體樣式。\(\{1,2,3,4,5\}\)分別代表常規、粗體、斜體、粗斜體、符號字體(代表以下一類,不要直接調用)。
  • font.axis:坐標軸刻度文字的字體樣式。
  • font.lab:坐標軸標簽的字體樣式。
  • font.main:標題的字體樣式。
  • font.sub:副標題的字體樣式。
  • ps:字體磅值,文本的最終大小為ps*cex
  • family:繪制文本時使用的字體族,標准取值為serif(襯線)、sans(無襯線)、mono(等寬)。

字體族的設置稍顯復雜,在Windows系統中mono映射為TT Courier New,sarif映射為TT Times New Roman,sans映射為TT Arial,這里TT指True Type。如果想要使用其他字體,需要創建新的映射,使用windowsFonts()windowsFont()來創建。

x <- c(20, 30, 40, 45, 60)
y <- c(16, 20, 27, 40, 60)

windowsFonts(
    A=windowsFont("Arial Black"),
    B=windowsFont("Bookman Old Style"),
    C=windowsFont("Comic Sans MS")
)

par(pch=17, lty=6, cex=2, lwd=3)  # 注意cex參數也會對文本產生影響
par(col='red')
par(font.main=4, family="C", ps=6)

plot(x, y, type="b", main="A Simple Try")
Rplot01

Unit 4:圖形尺寸與邊界尺寸

控制圖形尺寸和邊界大小的參數為:

  • pin:以英寸表示的圖形尺寸,是一個二元列表(寬和高)。
  • mai:以數值向量表示的邊界大小,單位為英寸(下、左、上、右)。
  • mar:以數值向量表示的邊界大小,單位為英分(下、左、上、右)。

Part 2:添加要素

Unit 1:添加標題和坐標軸標簽

添加標題和坐標軸標簽:使用title()函數,其調用格式為

title(main="main title",
      sub="subtitle",
      xlab="x-axis label",
      ylab="y-axis label")

可以在title()函數中添加其他圖形參數,如col.maincol.labcex.lab等。

Unit 2:添加個性化坐標軸

如果要添加個性化的坐標軸,通常要在plot()函數中設置一些圖形參數:

  • ann:取FALSE時,將不會畫出標題,包括主標題和副標題。
  • bty:設置邊框樣式,默認為"o"表示全部畫出,還有"l"(左下)、"7"(右上)、"c"(上下左)、"u"(左下右)、"]"(上下右)、"n"(無)。
  • xaxsyaxs:設置\(x, y\)軸的范圍,默認為"r"表示比范圍略大,"i"表示和給定作圖范圍完全相同。
  • xaxtyaxt:可以取"n",此時坐標軸、刻度線和刻度值將不會畫出。
  • axes:如果取FALSE,則所有坐標軸和框線都不會被畫出。

添加自定義的坐標軸:使用axis()函數,其調用格式為

axis(side, at=, labels=, pos=, lty=, col=, las=, tck=, ...)

各個參數的釋義為

  • side\(\{1,2,3,4\}\),表示在圖形的哪一邊繪制坐標軸(下、左、上、右)。
  • at:數值型向量,表示需要繪制刻度線的位置。
  • labels:字符型向量,刻度線旁的文字標簽,如果缺省則直接使用at中的值。
  • pos:坐標軸線繪制位置的坐標。
  • lty:線條類型。
  • col:線條和刻度線顏色。
  • las:標簽平行於坐標軸=0,垂直於坐標軸=2
  • tck:刻度線的長度,以相對於繪圖區域大小的分數表示,默認為-0.01,負值表示在圖形外側。
x <- c(20, 30, 40, 45, 60)
y <- c(16, 20, 27, 40, 60)

windowsFonts(
  A=windowsFont("Arial Black"),
  B=windowsFont("Bookman Old Style"),
  C=windowsFont("Comic Sans MS")
)

par(pch=17, lty=6, cex=1, lwd=3)
par(col='red')
par(font.main=2, family="C", ps=12)

plot(x, y, type="b", main="A Simple Try", yaxt="n")

z <- c(20, 21, 22, 23, 24, 26, 28, 30, 35, 42, 50, 60)
axis(4, at=z, labels=z, col.axis='blue', pos=50, las=2, lty=2, tck=-0.02, )
Rplot

Unit 3:添加圖例和參考線

要添加參考線,應當使用abline()函數,其使用格式為

abline(h=yvalues, v=xvalues)

這里h代表添加水平參考線的高度位置,v代表添加垂直參考線的水平位置。可以在其中添加其他圖形參數。

要添加圖例,應當使用legend()函數,其使用格式為

legend(location, title, legend, ...)
  • location:指定圖例的位置,可以給定圖例左上角的\(x,y\)坐標,也可以使用locator(1)用鼠標點擊,還可以使用bottom, bottomleft, left, topleft, top, topright, right, bottomright, center等關鍵字。
  • title:圖例標題的字符串。
  • legend:圖例標簽組成的字符型向量。

以下給出書上的案例:

rm(list=ls())
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 = T)

par(lwd=2, cex=1.5, 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=30, lwd=1.5, lty=2, col="gray")

library(Hmisc)
minor.tick(nx=3, ny=3, tick.ratio=0.5)  # 添加次要刻度線

legend("topleft", inset=0.05, title="Drug Type", c("A", "B"),
       lty=c(1, 2), pch=c(15, 17), col=c("red", "blue"))

par(opar)
Rplot02

Unit 4:添加輔助文本

文本添加可以通過函數函數text(),向圖形內部(通常是各個點)添加文本,使用格式為

text(location, "text to place", pos, ...)
  • location:文本的位置參數,可以是一對\((x, y)\)坐標,也可以通過location=locator(1)用鼠標來確定擺放位置。
  • pos:文本相對於位置參數的方位,\(\{1,2,3,4\}\)代表下、左、上、右。還可以追加指定參數offset作為偏移量。

還可以通過mtext()向圖形的四個邊界之一添加文本,使用格式為

mtext("text to place", side, line=n, ...)
  • side:指定擺放文本的邊,\(\{1,2,3,4\}\)代表下、左、上、右。
  • line:內移或外移文本,值越大,文本外移的程度越大。
  • adj:文本可以向左下對齊=0,或向右上對齊=1

Part 3:圖形組合

規則排布:可以使用par()函數中的圖形參數mfrow=c(nrows, ncols)來創建按行填充的、行數為nrows、列數為ncols的圖形矩陣。以下案例書上的實例代碼,數據集為R語言內置的mtcars

rm(list=ls())

opar <- par(no.readonly = T)

par(mfrow=c(2, 2))  # 將繪圖區域分成四塊
attach(mtcars)
plot(wt, mpg, main="Scatterplot of wt vs. mpg")  # 第一個圖
plot(wt, disp, main="Scatterplot of wt vs. disp")  # 第二個圖
hist(wt, main="Histogram of wt")  # 第三個圖
boxplot(wt, main="Boxplot of wt")  # 第四個圖
detach(mtcars)
par(opar)
Rplot02

復雜排布:可以使用layout(matrix)函數來組合圖形,這里matrix給定了圖形的所在位置,如

\[\begin{pmatrix} 1 & 1 \\ 2 & 3 \end{pmatrix} \]

就代表第一幅圖位於第一行的1、2列,第二幅圖位於第二行第一列,第三幅圖位於第二行第二列。

rm(list=ls())
opar <- par(no.readonly = T)
attach(mtcars)

mat <- matrix(c(1, 1, 2, 3), nrow=2, ncol=2, byrow=T)
layout(mat)  # 按照mat矩陣給出划分
hist(wt, main = "Graph_1")
hist(mpg, main = "Graph_2")
hist(disp, main = "Graph_3")

detach(mtcars)
par(opar)
Rplot

為了精細控制每幅圖形的相對大小,可以在layout()函數中使用widthsheights兩個參數,它們分別是各列寬度值構成的向量與各行寬度值構成的向量。現在,在上述代碼中加入這兩個參數。

rm(list=ls())
opar <- par(no.readonly = T)
attach(mtcars)

mat <- matrix(c(1, 1, 2, 3), nrow=2, ncol=2, byrow=T)
layout(mat, widths = c(3, 1), heights = c(1, 1.5))  # 按照mat矩陣給出划分
hist(wt, main = "Graph_1")
hist(mpg, main = "Graph_2")
hist(disp, main = "Graph_3")

detach(mtcars)
par(opar)
Rplot01

精細控制:可以使用par()函數的參數fig來精細控制,它接受四個\([0,1]\)之間的數,分別代表圖形在窗口內所占有矩形的四個端點。一般還要加入new=TRUE,使得新加入的圖形與原圖形位於同樣的畫布中。

注意,如果遇到Error in plot.new(): figure margins too large,則應當修改參數,這是因為由於設備的原因,子圖所需的大小與設置的參數沖突了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM