本系列是一個新的系列,在此係列中,我將和你們共同窗習R語言。因爲我對R語言的瞭解也甚少,因此本系列更多以一個學習者的視角來完成。windows
參考教材:《R語言實戰》第二版(Robert I.Kabacoff),書中所提到的John Cook的優秀博文,關於代碼規範的《來自Google的R語言編碼風格指南》。ide
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)
後,將還原默認參數環境。編碼
如下是用於指定符號和線條類型的參數:spa
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)
如下是用於指定顏色的參數: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
命令能夠給出全部調色板的列表。
字體族和字樣經過如下參數進行控制。
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")
控制圖形尺寸和邊界大小的參數爲:
pin
:以英寸表示的圖形尺寸,是一個二元列表(寬和高)。mai
:以數值向量表示的邊界大小,單位爲英寸(下、左、上、右)。mar
:以數值向量表示的邊界大小,單位爲英分(下、左、上、右)。添加標題和座標軸標籤:使用title()
函數,其調用格式爲
title(main="main title", sub="subtitle", xlab="x-axis label", ylab="y-axis label")
能夠在title()
函數中添加其餘圖形參數,如col.main
、col.lab
、cex.lab
等。
若是要添加個性化的座標軸,一般要在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, )
要添加參考線,應當使用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)
文本添加能夠經過函數函數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
。規則排布:可使用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
給定了圖形的所在位置,如
就表明第一幅圖位於第一行的一、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
,則應當修改參數,這是由於因爲設備的緣由,子圖所需的大小與設置的參數衝突了。