R語言學習2:繪圖

本系列是一個新的系列,在此係列中,我將和你們共同窗習R語言。因爲我對R語言的瞭解也甚少,因此本系列更多以一個學習者的視角來完成。windows

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

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)後,將還原默認參數環境編碼

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

  • 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:顏色

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

  • 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} \]

就表明第一幅圖位於第一行的一、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,則應當修改參數,這是由於因爲設備的緣由,子圖所需的大小與設置的參數衝突了。

相關文章
相關標籤/搜索