R語言基本畫圖函數與多圖多線的用法
常用統計作圖函數匯總
plot()
hist() 直方圖
stem() 莖葉圖
boxplot() 箱線圖(盒形圖)
coplot() 協同圖
qqnorm() 正態qq圖
qqplot() 兩總體qq圖
1. 高級低級圖形函數的常用選項
高、低級圖形函數概述
高級圖形函數可以迅速簡便地繪制常見類型的圖形,但是,某些情況下你可能希望繪制一些有特殊要求的圖形。比如,你希望坐標軸按照自己的設計繪制,在已有的圖上增加另一組數據,在圖中加入一行文本註釋,繪出多個曲線代表的數據的標簽,等等。
低級圖形函數讓你在已有的圖的基礎上進行添加。
低級圖形函數一般需要指定位置信息,其中的坐標指的是所謂用戶坐標,即前面的高級圖形函數所建立的坐標系中的坐標。坐標可以用兩個向量x和y給出,也可以由一個兩列的矩陣給出。如果交互作圖可以用下面介紹的locator()函數來交互地從圖形中直接輸入坐標位置。
最常用高級函數的是plot()函數。比如,
– plot(x,y)(其中x,y是向量)對兩個變量畫散點圖。
– 用plot(z) (其中z是一個定義瞭x變量和y變量的列表,或者一個兩列的矩陣)也可以達到同樣目的。
如果x是一個時間序列對象(時間序列對象用ts()函數生成),plot(x)繪制時間序列曲線圖。
– 如果x是一個普通向量,則繪制x的值對其下標的散點圖。
– 如果x是復數向量則繪制虛部對實部的散點圖。
– 如果f是一個因子,則plot(f)繪制f的條形圖(每個因子水平的個數)。
– 如果f是因子,y是同長度的數值向量,則plot(f,y)對f的每一因子水平繪制y中相應數值的盒形圖。
– 如果d是一個數值型數據框,則plot(d)對d的每兩個變量之間作圖(散點圖等)
load("F:/R/cl.RData") plot(cl$Sex)
高級繪圖函數常用選項
低級繪圖函數常用選項
低級圖形函數一般需要指定位置信息,其中的坐標指的是所謂用戶坐標,即前面的高級圖形函數所建立的坐標系中的坐標。坐標可以用兩個向量x和y給出,也可以由一個兩列的矩陣給出。如果交互作圖可以用下面介紹的locator()函數來交互地從圖形中直接輸入坐標位置。
圖形參數詳解
圖形元素
類型 | 解釋 |
---|---|
pch | 指定用於繪制散點的符號。繪制的點往往略高於或低於指定的坐標位置,僅pch=“.”無這個問題。 |
lty=2 | 指定畫線用的線型。缺省值lty=1是實線。從2開始是各種虛線。 |
lwd=2 | 指定線粗細,以標準線粗細為單位。這個參數影響數據曲線的線寬以及坐標軸的線寬。 |
col=2 | 指定顏色,可應用於繪點、線、文本、填充區域、圖象。顏色值也可以用象”red”,”blue” 這樣的顏色名指定。 |
font=2 | 用來指定字體的整數。一般font=1是正體,2是 黑體,3是 斜體,4是 黑斜體。 |
font.axisfont.labfont.mainfont.sub | 分別用來指定坐標刻度、坐標軸標簽、標題、小標題所用的字體。 |
adj=-0.1 | 指定文本相對於給定坐標的對齊方式。取0表示左對齊,取1表示右對齊,取0.5表示居中。此參數的值實際代表的是出現在給定坐標左邊的文本的比例,所以adj=-0.1的效果是文本出現在給定坐標位置的右邊並空出相當於文本10%長度的距離。 |
cex=1.5 | 指定字符放大倍數。 |
坐標軸與坐標刻度
許多高級圖形帶有坐標軸,還可以先不畫坐標軸然後用axis()單獨加。
函數box() 用來畫坐標區域四周的框線。
坐標軸包括三個部件:軸線(用lty可以控制線型),刻度線,刻度標簽。它們可以用如下的圖形參數來控制:
參數 | 解釋 |
---|---|
lab=c(5, 7, 12) | 第一個數為x軸希望畫幾個刻度線,第二個數為y軸希望畫幾個刻度線,這兩個數是建議性的;第三個數是坐標刻度標簽的寬度為多少個字符,包括小數點,這個數太小會使刻度標簽四舍五入成一樣的值。 |
las=1 | 坐標刻度標簽的方向。0表示總是平行於坐標軸,1表示總是水平,2表示總是垂直於坐標軸。 |
mgp=c(3,1,0) | 坐標軸各部件的位置。第一個元素為坐標軸位置到坐標軸標簽的距離,以文本行高為單位。第二個元素為坐標軸位置到坐標刻度標簽的距離。第三個元素為坐標軸位置到實際畫的坐標軸的距離,通常是0。 |
tck=0.01 | 坐標軸刻度線長度,單位是繪圖區域大小,值為占繪圖區域的比例。tck小於0.5時x軸和y 軸的刻度線將統一到相同的長度。取1時即畫格子線。取負值時刻度線畫在繪圖區域的外面。 |
xaxs=”s”yaxs=”d” | 控制x軸和y軸的畫軸方法。取值為”s”(即standard)或”e”(即extended)的時候數據范圍控制在最小刻度和最大刻度之間。取”e”時如果有數據點十分靠近邊緣軸的范圍會略微擴大。這種畫軸方式有時會在軸的一邊留下太大的空白。取值為“i”(即internal)或“r”(此為缺省)使得刻度線都落在數據范圍內部,而“r”方式所留的邊空較小。取值設為”d”時會鎖定此坐標軸,後續的圖形都使用與它完全相同的坐標軸,這在要生成一系列可比較的圖形的時候是有用的。要解除鎖定需要把這個圖形參數設為其它值。 |
一頁多圖
一頁多圖用mfrow參數或mfcol參數規定,如:
par(mfrow=c(3,2)) 表示同一頁有三行兩列共六個圖,而且次序為按行填放。
類似地,par(mfcol=c(3,2))規定相同的窗格結構,但是次序為按列填放,即先填滿第一列的三個再填第二列。
par(mfrow=c(1,1))即可。缺省時無外邊空。為瞭規定外邊空大小,可以用omi參數或oma參數。omi參數使用英寸為單位,oma參數以文本行高為單位,兩個參數均為四個元素的向量,分別給出下、左、上、右方的邊空大小。
如:par(oma=c(2,0,3,0))函數mtext用來在外邊空加文字標註。
其用法為mtext(text, side = 3, line = 0, outer = FALSE)
在多圖環境中還可以用mfg參數來直接跳到某一個窗格,比如par(mfg=c(2,2,3,2))表示在三行兩列的多圖環境中直接跳到第二行第二列位置。mfg參數的後兩個表示多圖環境的行、列數,前兩個表示要跳到的位置。
可以不使用多圖環境而直接在頁面中的任意位置產生一個窗格來繪圖,參數為fig,如:par(fig=c(4,9,1,4)/10)此參數為一個向量,分別給出窗格的左、右、下、上邊緣的位置,取值為占全頁面的比例,比如上面的例子在頁面的右下方開一個窗格作圖。
圖形邊空
S中一個單獨的圖由繪圖區域(繪圖的點、線等畫在這個區域中)和包圍繪圖區域的邊空組成,邊空中可以包含坐標軸標簽、坐標軸刻度標簽、標題、小標題等,繪圖區域一般被坐標軸包圍。
邊空的大小由mai參數或mar參數控制,它們都是四個元素的向量,分別規定下方、左方、上方、右方的邊空大小,其中mai取值的單位是英寸,而mar的取值單位是文本行高度。
例如:
par(mai=c(1, 0.5, 0.5, 0)) par(mar=c(4, 2, 2, 1))
這兩個圖形參數不是獨立的,設定一個會影響另一個。S缺省的圖形邊空常常太大,以至於有時圖形窗口較小時邊空占瞭整個圖形的很大一部分。
通常我們可以取消右邊空,並且在不用標題時可以大大縮小上邊空。例如下例可以生成十分緊湊的圖形:
oldpar <- par(mar=c(2,2,1,0.2)) plot(x,y)
在一個頁面上畫多個圖時邊空自動減半,但我們往往還需要進一步減小邊空才能使多個圖有意義。
交互圖形函數
函數locator(n, type)運行時會停下來等待用戶在圖中點擊,然後返回圖形中鼠標點擊的位置的坐標。等待點擊時用鼠標中鍵點擊可以選擇停止等待,立即返回。參數n指定點擊多少次後自動停止,缺省為500次;參數type如果使用則可指定繪點類型,與plot()函數中的type 參數用法相同,在鼠標點擊處繪點(線、垂線,等等)。locator()的返回值是一個列表,有兩個變量(元素)x和y,分別保存點擊位置的橫坐標和縱坐標
例如,為瞭在已經繪制的曲線圖中找一個空地方標上一行文本,隻要使用如下程序:
text(locator(1), "Normal density", adj=0)
text()函數的adj參數用一個數字表示文本串相對於給定的坐標的畫法,adj=0表示給定坐標為文本串左側的坐標,adj=1表示給定坐標為文本串右側的坐標,adj=0.5表示給定坐標為文本串中間的坐標。
函數identify(x, y, labels)在運行時也會停下來等待用戶點擊,直到按瞭鼠標中鍵,任何返回用戶在圖形中用鼠標點擊的點的序號,點擊時對點擊的點加標簽。參數x和y給出要識別的各個點的坐標。labels參數指定點擊某個點時要在旁邊繪制的文本標簽,缺省時標出此點的序號,如果隻需要返回值而不想畫任何標記則可以在調用此函數時加一個plot=F參數。
註意identify()與locator()不同,locator()返回圖中任意點擊位置的坐標,而identify() 隻返回離點擊位置最近的點的序號。例如,我們在向量x和y中有若幹個點的坐標,運行如下程序:
attach(cl) plot(Height, Weight) ; identify(Height,Weight)
這時顯示轉移到圖形窗口,進入等待狀態,用戶可以點擊圖中特別的點,該點的序號就會在旁邊標出。為瞭結束,隻要單擊鼠標中鍵或單擊右鍵並選擇停止。返回結果為你點擊的各個點的序號:
警告: 已經找到瞭最近的點
警告: 沒有0.25英尺的點
[1] 1 2 10 15 16
2. hist直方圖
hist(x)作向量x的直方圖。缺省時自動確定分組,也可以用nclass=參數指定分組個數,或者用breaks=參數指定一個分組點向量。如果指定瞭prob=T則縱軸顯示密度估計。
3. stem莖葉圖
Usage:
stem(x, scale = 1, width = 80, atom = 1e-08)
Arguments:
x: a numeric vector.
scale: This controls the plot length.
width: The desired width of plot.
atom: a tolerance.
References:
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) _The New S
Language_. Wadsworth & Brooks/Cole.
Examples:
stem(islands)
stem(log10(islands))
stem(cl$Weight, scale = 1, width = 80, atom = 1e-08) The decimal point is 1 digit(s) to the right of the | 4 | 1 6 | 7 8 | 3445508 10 | 0332233 12 | 83 14 | 0
4. boxplot箱線圖
箱線圖的圖形中的參數意義如下:
例子: 作瞭兩個圖疊加,一個為subset= supp == “VC“,另一個為subset= supp == ”OJ“.數據ToothGrowth有兩個數量變量(len,dose)和一個屬性變量(supp); 對每個supp,dose各有三個值(各形成三個盒形圖). len ~ dose意味著box為len所做.
data(ToothGrowth) boxplot(len ~ dose, data = ToothGrowth, boxwex = 0.25, at = 1:3 - 0.2, subset= supp == "VC", col="yellow", main="Guinea Pigs' Tooth Growth", xlab="Vitamin C dose mg", ylab="tooth length", ylim=c(0,35)) boxplot(len ~ dose, data = ToothGrowth, add = TRUE, boxwex = 0.25, at = 1:3 + 0.2, subset= supp == "OJ", col="orange") legend(2, 9, c("Ascorbic acid", "Orange juice"), fill = c("yellow", "orange"))
boxplot(cl$Height~cl$Sex,data=cl,col = "lightgray");
5. coplot() 協同圖
attach(cl) coplot(Weight ~ Height | Sex)
如果z是一個數值型變量,則coplot() 先對z的取值分組,然後對z的每一組取值分別繪圖。
甚至可以用如coplot(y~x | x1+x2)表示對x1和x2的每一水平組合繪圖。
coplot()和pairs()函數缺省繪制散點圖,但可以用一個panel= 參數指定其它的低級繪圖函數,如lines,panel.smooth等。
tsplot(x)繪制時間序列曲線圖。多個參數時tsplot(x1, x2, …)表示繪制多條曲線,自動統一曲線取值范圍。如果參數非時間序列對象則以下標1,2,3等為橫坐標繪圖。
6. qqnorm() 正態qq圖與qqplot() 兩總體qq圖
– qqnorm(x), qqline(x), qqplot(x,y)作分位數-分位數圖。
– qqnorm(x)對向量x作正態概率(縱軸為次序統計量值,橫軸為對應該次序統計量的標準正態分佈分位數值)。
– qqline(x) 除作qqnorm(x)圖之外還畫一條擬合曲線。
qqplot(x,y)把x和y的次序統計量分別畫在x軸和y 軸以比較兩個變量的分佈。
x <- rnorm(50) y <- rexp(60) qqplot(x,y)#可以判斷是不是同一個類型的分佈
多圖多線
1 多圖
par(mfrow=c(2,2))#準備畫22的4個圖 plot(compression, distance,main= "Hooke's Law") #隻有標題的圖 plot(compression, distance,main= "Hooke's Law", xlab= "x",ylab= "y") #標題+x,y標記 identify(compression,distance) #標出點號碼 plot(compression, distance,main="Hooke's Law") #隻有標題的圖 text(46,120, "f=1/2*k*s")#在指定位寫入文字 plot(compression, distance,main="Hooke's Law") #隻有標題的圖 text(locator(2), "I am here!") #在點擊的兩個位置寫入文字
2 標簽
#畫圖 (對數變換後) Par(cex=0.7,mex=0.7) #character (cex) & margin (mex) expansion plot(log(body),log(brain)) text(x=log(body), y=log(brain),labels=row.names(Animals), adj=1.5)# adj=0 implies left adjusted text #畫圖 (對數變換後) plot(log(body),log(brain)) identify(log(body),log(brain),row.names(Animals))
3 顏色畫圖函數
view.colours = function(){ plot(1, 1, xlim=c(0,14), ylim=c(0,3), type="n", axes=F, xlab="",ylab="") text(1:6, rep(2.5,6), paste(1:6), col=palette()[1:6], cex=2.5) text(10, 2.5, "Default palette", adj=0) rainchars = c("R","O","Y","G","B","I","V") text(1:7, rep(1.5,7), rainchars, col=rainbow(7), cex=2.5) text(10, 1.5, "rainbow(7)", adj=0) cmtxt = substring("cm.colors", 1:9,1:9) # Split "cm.colors" into its 9 characters text(1:9, rep(0.5,9), cmtxt, col=cm.colors(9), cex=3) text(10, 0.5, "cm.colors(9)", adj=0) } view.colours()
4 多線
高級低級函數畫圖
x <- seq(-pi, pi, len = 65) plot(x, sin(x), type = "l", ylim = c(-1.2, 1.8), col = 3, lty = 2) points(x, cos(x), pch = 3, col = 4) lines(x, tan(x), type = "b", lty = 1, pch = 4, col = 6) title("legend(..., lty = c(2, -1, 1), pch = c(-1,3,4), merge = TRUE)", cex.main = 1.1) # 註意圖例書寫方式 legend(-1, 1.9, c("sin", "cos", "tan"), col = c(3,4,6), lty = c(2, -1, 1), pch = c(-1, 3, 4), merge = TRUE, bg='gray90')
matplot畫圖
matplot :用矩陣的列畫多線圖
Usage:
matplot(x, y, type = "p", lty = 1:5, lwd = 1, lend = par("lend"), pch = NULL, col = 1:6, cex = NULL, bg = NA, xlab = NULL, ylab = NULL, xlim = NULL, ylim = NULL, ..., add = FALSE, verbose = getOption("verbose"))
require(grDevices) matplot((-4:5)^2, main = "Quadratic") # almost identical to plot(*) sines <- outer(1:20, 1:4, function(x, y) sin(x / 20 * pi * y)) matplot(sines, pch = 1:4, type = "o", col = rainbow(ncol(sines))) matplot(sines, type = "b", pch = 21:23, col = 2:5, bg = 2:5, main = "matplot(...., pch = 21:23, bg = 2:5)")
5 時間序列圖
x=runif(100) x=ts(x,start=1960+(3/12),frequency=12)#構造時間序列frequency=12即按個月份構造 options(digits=2) x
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 1960 0.444 0.849 0.459 0.659 0.277 0.268 0.958 0.926 0.595 1961 0.250 0.769 0.111 0.944 0.593 0.459 0.670 0.331 0.045 0.694 0.473 0.227 1962 0.037 0.181 0.562 0.455 0.419 0.968 0.288 0.187 0.143 0.548 0.437 0.280 1963 0.149 0.623 0.937 0.108 0.755 0.077 0.963 0.781 0.660 0.458 0.787 0.176 1964 0.997 0.650 0.045 0.849 0.018 0.744 0.148 0.964 0.844 0.660 0.080 0.303 1965 0.954 0.217 0.909 0.658 0.991 0.797 0.020 0.363 0.183 0.332 0.793 0.676 1966 0.459 0.270 0.813 0.818 0.138 0.780 0.679 0.029 0.553 0.895 0.548 0.480 1967 0.898 0.212 0.299 0.223 0.637 0.167 0.102 0.424 0.438 0.058 0.048 0.474 1968 0.254 0.381 0.532 0.089 0.825 0.337 0.382
plot(x,main="Time series")
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。