本系列是一個新的系列,在此系列中,我將和大家共同學習R語言。由於我對R語言的了解也甚少,所以本系列更多以一個學習者的視角來完成。
參考教材:《R語言實戰》第二版(Robert I.Kabacoff),書中所提到的John Cook的優秀博文,關於代碼規范的《來自Google的R語言編碼風格指南》。
Part 1:圖形參數
Unit 1:點型和線型
plot()
是R中為對象作圖的一個泛型函數,它的輸出由所繪制對象的類型不同而不同。如果x
和y
是兩個等長的數字向量,則以下代碼將繪制點集\((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。

也可以直接在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")

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.main
、col.lab
、cex.lab
等。
Unit 2:添加個性化坐標軸
如果要添加個性化的坐標軸,通常要在plot()
函數中設置一些圖形參數:
ann
:取FALSE
時,將不會畫出標題,包括主標題和副標題。bty
:設置邊框樣式,默認為"o"
表示全部畫出,還有"l"
(左下)、"7"
(右上)、"c"
(上下左)、"u"
(左下右)、"]"
(上下右)、"n"
(無)。xaxs
和yaxs
:設置\(x, y\)軸的范圍,默認為"r"
表示比范圍略大,"i"
表示和給定作圖范圍完全相同。xaxt
和yaxt
:可以取"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, )

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)

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)

復雜排布:可以使用layout(matrix)
函數來組合圖形,這里matrix
給定了圖形的所在位置,如
就代表第一幅圖位於第一行的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)

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

精細控制:可以使用par()
函數的參數fig
來精細控制,它接受四個\([0,1]\)之間的數,分別代表圖形在窗口內所占有矩形的四個端點。一般還要加入new=TRUE
,使得新加入的圖形與原圖形位於同樣的畫布中。
注意,如果遇到Error in plot.new(): figure margins too large
,則應當修改參數,這是因為由於設備的原因,子圖所需的大小與設置的參數沖突了。