1. 程式人生 > >R語言基本畫圖函式與多圖多線

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意味著boxlen所做.

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= 引數指定其它的低階繪圖函式,如linespanel.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))#準備畫22的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 多線

  1. 高階低階函式畫圖
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')

這裡寫圖片描述

  1. 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")

這裡寫圖片描述