原文鏈接:https://wklchris./R-plotting-basic.html R 的繪圖功能一直為業(yè)內(nèi)所津津樂道。用了 Python 的 matplolibt 和 R 的 ggplot2 后,我再也不想用 MATLAB 畫圖了。 我現(xiàn)在這里先給出本博文用到的包: library(Hmisc)
Loading required package: lattice Loading required package: survival Loading required package: Formula Loading required package: ggplot2
Attaching package: 'Hmisc'
The following objects are masked from 'package:base':
format.pval, round.POSIXt, trunc.POSIXt, units
library(vioplot)
Loading required package: sm Package 'sm', version 2.2-5.4: type help(sm) for summary information
基礎(chǔ)命令使用 dev.new() 命令新建一個圖片視圖,這樣你可以輸出多個圖片到屏幕,而不是讓之后輸出的覆蓋之前的圖形。關(guān)于 dev.next(), dev.prev(), dev.set() 及 dev.off() 等內(nèi)容,參考 help(dev.cur). plot() 繪圖類型基本的繪圖類型有以下幾種,使用 type= 參數(shù)指定: p:僅數(shù)據(jù)點,默認值。 l:僅線段 b:線段與點 c:僅線段,但點的位置留出空白 o:線段與點,但線段會延伸到點內(nèi)部 h:直方圖風格,即帶豎直密度線 s:階梯圖 S:其他特殊情況 n;不繪制圖形。用于指定標題、坐標軸名稱的情況
輸出到文件將畫圖的內(nèi)容輸出到文件,可以指定路徑,不指定就輸出到當前工作目錄。例如輸出 pdf: pdf('plot.pdf') plot(c(1, 2, 3), c(3, 4, 2)) dev.off()
除了 pdf() 外,其他可用的輸出格式對應(yīng)函數(shù): 例子。詳細的參數(shù)在下文討論。 x <- 1:4y <- c(2, 4, 3, 1)plot(x, y, type='b')

繪圖參數(shù):par()
函數(shù) par() 用來獲取當前圖形的參數(shù)。如果加入 no.readonly=TRUE, 表示該參數(shù)列表是非只讀的,即用戶可以進行修改。例如對于上圖,我們獲取其參數(shù),進行更改后再傳到新的圖中(pch 參數(shù)可能有些費解,我們在下文討論): # 方法一:類交互式的更改方法opar <- par(no.readonly=T)par(pch=17) # 更改點樣式plot(x, y, type='b')par(opar)# 方法二:部分繪圖參數(shù)支持直接傳入?yún)?shù)# plot(x, y, type='b', pch=17)

點樣式、線寬與線型
參數(shù) | 可選值 |
---|
pch 點樣式 | 0空方塊,1空圓,2空三角,3加號,4乘號,5斜空方塊,6空倒三角,7叉方塊,8星號,9斜叉方塊,10圈加號,11六芒星,12田,13圈乘號,14加框尖角,15方塊,16圓點,17三角,18斜方塊,19帶邊線圓點,20帶邊線2/3圓點,21填充圓,22填充方塊,23填充斜方塊,24填充三角,25填充倒三角。 | cex 點大小 | 數(shù)字,例如 0.5。 | lty 線型 | 1實線,2短虛線,3點線,4點劃線,5長虛線,6長短劃線。 | lwd 線寬 | 數(shù)字。 |
注: pch = 19 相比 pch = 16,主要體現(xiàn)在 lwd 與 cex 不同時,帶邊線圓點的尺寸較大。 顏色調(diào)整顏色的參數(shù)有: col: 繪圖顏色。 col.axis:坐標軸刻度顏色。 col.lab:坐標軸名稱顏色。 col.main:圖形標題顏色。 col.sub:副標題顏色。 fg:圖形前景色。 bf:圖形背景色。
指定顏色的方式有如下幾種: 數(shù)字下標:col=1 名稱:col=”white” 十六進制值:col=”#FFFFFF” 標準化RGB/HSV值:col=rgb(0,1,1)/hsv(0,0,1)
至于 R 支持的顏色名稱,多達 600 余種,這里給出一些我認為常見的: OutputColors <- function(color.names, titleStr='', showText=F) { plot(1,1, axes=F, xlim=c(0, 6), ylim=c(0, 6), main=titleStr, xlab='', ylab='') for (i in c(1:5)) { for (j in c(1:5)) { par(new=T) plot(i, 6-j, cex=3, xlim=c(0, 6), ylim=c(0, 6), axes=F, main='', xlab='', ylab='', pch=19, col=color.names[(i-1)*5+j]) if (showText) { text(i, 6-j-0.1, pos=1, color.names[(i-1)*5+j]) } } }}colorLst <- c('white', 'red', 'green', 'blue', 'brown', 'cyan', 'gold', 'gray', 'plum', 'magenta', 'orange', 'purple', 'yellow', 'black', 'violet', 'darkblue', 'darkgreen', 'darkred', 'darkgray', 'dimgray', 'lightblue', 'lightgreen', 'lightgray', 'orchid', 'pink')OutputColors(colorLst, '25 Useful Colors', T)

R 中還有其他方式可以生成一系列的顏色,比如: par(mfrow=c(2 ,3))OutputColors(rainbow(25), 'Rainbow')OutputColors(heat.colors(25), 'HeatMap')OutputColors(terrain.colors(25), 'TerrainMap')OutputColors(topo.colors(25), 'Topo')OutputColors(cm.colors(25), 'CM')# 灰度:需要標準化OutputColors(gray(1/25*c(0:25)), 'Gray')

標簽和標題文本從上文可以看出端倪,標簽與標題參數(shù)有: 標題/副標題:title/sub 坐標軸標題:xlab/ylab
在標題中使用上文介紹的參數(shù): title(main='My Title', col.main='red', sub='My Subtitle', col.sub='blue', xlab='My X label', ylab='My Y label', col.lab='green', cex.lab=0.75)
要定義它們的字體,可添加的參數(shù)有: 參數(shù) | 含義 |
---|
cex | 基礎(chǔ)縮放倍數(shù) | cex.axis | 坐標軸刻度的縮放倍數(shù) | cex.lab | 坐標軸標題的縮放倍數(shù) | cex.main | 圖形標題的縮放倍數(shù) | cex.sub | 圖形副標題的縮放倍數(shù) | font | 字體樣式。1常規(guī),2加粗,3加斜,4加粗加斜,5符號字體 | font.axis | 坐標軸刻度的字體樣式 | font.lab/ main/ sub | 類推 | ps | 字體磅值。文字的最終大小為 cex * ps | family | 字族。例如 serif襯線, sans無襯線, mono等寬 |
字族的使用需要注意:Windows 中,等寬映射為 Courier New,襯線 Times New Roman,無襯線 Arial。你可以使用 windowsFonts() 函數(shù)來更改或者創(chuàng)建映射,例如我個人常用的 DejaVu 等寬字體: windowsFonts( M=windowsFont('DejaVu Sans Mono'))plot(1, 1, type='n')# 字體示例text(1, 1.05, paste('DejaVu Sans Mono\n', '0123456789!@#$%^&*()[]{}:;,.<>'/?`~', 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', sep='\n'), pos=1, family='M')

如果你需要將圖片輸出到 pdf,這個參數(shù)也是可以使用的: pdf(file='filename.pdf', family='M')
圖形尺寸與邊距參數(shù) pin 用于指定圖形尺寸(英寸),例如 pin=c(4, 3) 表示 4 英寸寬 3 英寸高。 用 mai()/mar() 依次指定下左上右四個方向的邊距,單位分別是英寸與英分。默認是 mar(c(5, 4, 4, 2)) + 0.1 自定義其他元素坐標軸函數(shù) side() 用于自定義坐標軸: axis(side, at=, labels=, pos=, lty=, col=, las=, tck=, ...)
網(wǎng)格線:abline() 與次要刻度如果想使用次要刻度,請安裝 Hmisc 包。次要刻度的長度將會是主刻度的 tick.ratio 倍。 網(wǎng)格線使用 abline() 命令,并分別用 h/v 指定網(wǎng)格線是豎直還是水平。 # 需要加載:library(Hmisc)plot(1:3, 1:3, type='b', xlim=c(0, 4), ylim=c(0, 4))minor.tick(nx=2, ny=4, tick.ratio=0.5)abline(v=seq(0, 4, 0.5), h=seq(0, 4, 0.25), lty=2, col='darkred')

圖例命令 legend() 用于添加圖例。 legend(location, legend, [title=, ...])
參數(shù)含義: 例子參見“直方圖”一節(jié)的最后一例。 標注文字標注主要有兩個函數(shù):text() 與 mtext()。前者向繪圖區(qū)添加標注,后者向圖形的邊界添加標注。 text(location, 'string', pos, ...) mtext('string', side, line=n, ...)
可以參考“標簽和標題文本”一節(jié)的例子。其中: 數(shù)學標注類似 LaTeX 的標注方式,不過實質(zhì)上仍有一些區(qū)別: 代碼 | 效果 | 代碼 | 效果 | 代碼 | 效果 |
---|
x%+-%y | x±y | x%/%y | x÷y | x%*%y | x×y | x%.%y | x?y | x[i] | xi | x^2 | x2 | x%prop%y | x∝y | sqrt(x, y) | y√x | x!=y | x≠y | x%~~%y | x≈y | x%=~%y | x?y | x%==%y | x≡y |
部分字體相關(guān)的命令: plain(x):正體 italic(x):意大利字族(加斜) bold(x):加粗 bolditalic(x):加斜加粗 underline(x):下劃線
疊加繪圖疊加繪圖最簡單的方法,就是使用繪圖的 new=TRUE : plot( ... )plot( ... , new=TRUE) # 記得用 axes=FALSE 將坐標軸、標簽、標題隱藏掉
如果想要添加額外的點、線,使用 points() 命令與 lines() 命令。以及上面提到的參考線 abline() 命令: plot(1:3, c(1,3,2), type='b', pch=2)points(1:3, seq(1.5, 2.5, 0.5), col='blue', pch=16)lines(1:3, seq(1.5, 2.5, 0.5), col='red')abline(v=1.5, h=2.25, lty=2,col='purple')
子圖函數(shù) layout()函數(shù) layout() 是一個強大的命令。例如: layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE))
就指定了圖 1 占用第一行,圖 2 和 3 共用第二行。也可以用 widths=/heights= 參數(shù)指定各列寬/各行高之間的比例: tmp <- c(rep('Cat', 3), rep('Dog', 4), rep('Rabbit', 2))dt <- table(tmp)layout(matrix(c(1, 1, 2, 3), 2, 2, byrow = TRUE), widths=c(3, 1), heights=c(1, 2))barplot(dt)barplot(dt)barplot(dt)
函數(shù) par() 的 mfrow 參數(shù)前文介紹過的 par() 中的 mfrow= 參數(shù)也是一個控制子圖的方式。下例是兩行兩列的子圖: opar <- par(no.readonly=TRUE) par(mfrow=c(2,2)) plot(...) # 圖 1,左上 plot(...) # 圖 2,右上 plot(...) # 圖 3,左下 plot(...) # 圖 4,右下 par(opar)
函數(shù) par() 的 fig 參數(shù)這種方式支持你以任何的位置、組合任意的圖形。它比規(guī)整的 layout() 更加靈活。以下不使用 0.8 而使用 0.65 是為了看上去更緊湊。 opar <- par(no.readonly=TRUE)par(fig=c(0, 0.8, 0, 0.8)) # 主圖:橫向范圍與縱向范圍(左下為原點)barplot(dt)par(fig=c(0, 0.8, 0.65, 1), new=TRUE) # 上方的圖。注意 new 參數(shù)barplot(dt, axes=F)par(fig=c(0.65, 1, 0, 0.8), new=TRUE) # 右側(cè)的圖barplot(dt, axes=F, names.arg='')
統(tǒng)計圖條形圖:barplot()直接上例子。 tmp <- c(rep('Cat', 3), rep('Dog', 4), rep('Rabbit', 2))dt <- table(tmp)barplot(dt, main='Title of Barplot', xlab='Pets', ylab='Number', col='green', border='blue', density=c(5, 15, 25), names.arg=paste('Pet', 1:3, sep=' '))
餅圖:pie()并不推薦的統(tǒng)計圖類型,因此 R 中的功能也很有限。 pie(x, labels=, ...)
dt <- 1:4lbl <- c('A', 'B', 'C', 'D')pie(dt, labels=paste(lbl, ' ', round(dt/sum(dt)*100), '%', sep=''), col=topo.colors(length(lbl)), main='Pie Chart with Percentage')
直方圖:hist() 及核密度曲線直方圖表示的是一維的數(shù)據(jù)(連續(xù)型)特征,縱軸是其在對應(yīng)橫軸區(qū)間內(nèi)的頻數(shù)或者頻率。 hist(x, freq=TRUE, breaks=, ...)
其中 freq 參數(shù)默認指定縱軸為頻數(shù)而不是頻率,break 用于指定橫軸上分組的個數(shù)。 set.seed(123)dt <- rnorm(100, mean=0, sd=1)par(mfrow=c(1,2))# 左圖:頻率直方圖,以及軸須圖hist(dt, freq=F, breaks=10, col='cyan', main='Hist fig 1')rug(jitter(dt)) # 如果有許多相同值,參數(shù) amount=0.01 可將其隨機化lines(density(dt), col='purple', lwd=2)# 右圖:頻數(shù)直方圖,以及正態(tài)密度曲線h.plot <- hist(dt, breaks=10, col='lightgreen', main='Hist fig 2')xfit <- seq(min(dt), max(dt), length.out=40)yfit <- dnorm(xfit, mean=mean(dt), sd=sd(dt))yfit <- yfit*diff(h.plot$mids[1:2])*length(dt)lines(xfit, yfit, col='blue', lwd=2)box()
軸須圖是一種一維的數(shù)據(jù)呈現(xiàn),而上面的左圖中的密度曲線是一種核密度估計。要比較核密度圖,參考 sm 包的 sm.density.compare() 函數(shù)。如果只是要繪制,使用 density() 函數(shù)輔助即可: plot(density(dt), main='Kernel Denisty')polygon(density(dt), col='lightgreen', border='blue', lwd=2) # 繪制多邊形的函數(shù)# 疊加正態(tài)曲線xfit <- seq(min(dt), max(dt), length.out=40)yfit <- dnorm(xfit, mean=mean(dt), sd=sd(dt))lines(xfit, yfit, col='red', lwd=2)legend('topright', lty=c(1,1), col=c('blue', 'red'), legend=c('Kernel Density', 'Normality Curve'))
箱形圖:boxplot() 及小提琴圖或者叫箱線圖、盒須圖。它描述了連續(xù)變量的五個特征參數(shù): fig <- boxplot(dt, main='Box Plot')paras <- c('Min', '25 percentile', 'Mean', '75 percentile', 'Max')text(1.25, fig$stats, paras, pos=4)text(0.9, fig$out, 'Abnormal Points', pos=2)
如果是 dataframe 數(shù)據(jù)集中的類別型變量 A ,使用如下語句生成并列箱形圖: boxplot(y~A, data=dataframe)
如果將公式改寫成 y~A*B ,那么會將類別型變量 A 和 B 的各水平兩兩組合,再生成箱形圖。 其他參數(shù): varwidth=F/T:為 TRUE 時,箱形圖的寬度與樣本數(shù)的算術(shù)平方根成正比。 horizontal=F/T:為 TRUE 時,箱形圖被橫置。 notch=F/T:為 TRUE 時,箱形圖在繪制時會顯示“凹槽”。
df <- data.frame(x=dt, type=NA)df <- df[order(df$x),]df$type <- c(rep('Smaller', 50), rep('Larger',50))boxplot(x ~ type, data=df, col='darkgray', main='Boxplot')
最后再提一下箱形圖與核密度圖的一個結(jié)合體:小提琴圖(violin plot)。這種圖的繪制需要 vioplot 包。 在小提琴圖中,核密度曲線被豎直放置,并對稱地顯示于數(shù)據(jù)軸的兩側(cè): # 需要加載:library(vioplot)vioplot(df$x[df$type == 'Larger'], df$x[df$type == 'Smaller'], names=c('L', 'S'), col='gold')
點圖用于在水平刻度上繪制大量標簽。本例選自參考書目同名章節(jié)。各參數(shù): # mtcars 是 R 預裝的數(shù)據(jù)集,其 cyl 變量有三個水平x <- mtcars[order(mtcars$mpg),]x$cyl <- factor(x$cyl)x$color[x$cyl==4] <- 'red'x$color[x$cyl==6] <- 'blue'x$color[x$cyl==8] <- 'darkgreen'dotchart(x$mpg, labels = row.names(x), cex=.7, groups = x$cyl, gcolor = 'black', color = x$color, pch=19, main = 'Gas Mileage for Car Models\ngrouped by cylinder', xlab = 'Miles Per Gallon')
|