R學習筆記(3):繪圖


 

有人說,統計的本質就是數據的可視化。

經過前面兩篇的學習內容,我們已經大體知道了R是什么以及R中主要的數據類型和數據結構。盡管了解得很粗淺,但我還是迫不及待的進入了“繪圖”這一主題。

R提供了非常豐富的繪圖功能,可以通過命令:demo (graphics) 或者demo(persp)來體驗R繪圖功能的強大。

圖形工具是 R 環境的一個重要組成部分。 R提供了多種繪圖相關的命令,分成三類:

 

•高級繪圖命令:在圖形設備上產生一個新的圖區,它可能包括坐標軸,標簽,標題等等。

•低級繪圖命令:在一個已經存在的圖上加上更多的圖形元素,如額外的點,線和標簽。

•交互式圖形命令:允許交互式地用鼠標在一個已經存在的圖上添加圖形信息或者提取圖形信息。

 

在R中執行繪圖命令,會啟動一個圖形設備驅動(device driver)。該驅動會打開特定的圖形窗口(graphics window)以顯示交互式的圖片。一旦設備驅動啟動,R 繪圖命令可以用來產生統計圖或者設計全新的圖形顯示。此外,R 有一系列圖形參數。這些圖形參數可以修改從而定制你的圖形環境。

 

高級繪圖命令

高級圖形顯示函數可以根據數據顯示完整的圖形(chart),包括坐標軸,標簽、標題、序列等。如果你之前熟悉其他繪圖庫(比如JFreeChart,matplotlib等)的概念,可以很容易的掌握R中的繪圖函數。

圖表類型

R支持很多圖表類型。在擴展包里面可能會提供更多的圖表類型。下表給出R基本環境中支持的圖表類型及其對應的繪圖函數:

plot(x)          以x的元素值為縱坐標、以序號為橫坐標繪圖

plot(x,y)        x(在x-軸上)與y(在y-軸上)的二元作圖

sunflowerplot(x,y)同上,但是以相似坐標的點作為花朵,其花瓣數目為點的個數

pie(x)餅圖

boxplot(x)盒形圖(“box-and-whiskers”)

stripchart(x)把x的值畫在一條線段上,樣本量較小時可作為盒形圖的替代

coplot(x~y|z)關於z的每個數值(或數值區間)繪制x與y的二元圖

interaction.plot(f1, f2, y)如果f1和f2是因子,作y的均值圖,以f1的不同值作為x軸, 而f2的不同值對應不同曲線;可以用選項fun指定y的其他的統計量(缺省計算均值,fun=mean)

matplot(x,y)二元圖,其中x的第一列對應y的第一列,x的第二列對應y的第二列,依次類推。

dotchart(x)如果x是數據框,作Cleveland點圖(逐行逐列累加圖)

fourfoldplot(x)用四個四分之一圓顯示2X2列聯表情況(x必須是dim=c(2,2,k)的數組,或者是dim=c(2,2)的矩陣,如果k=1)

assocplot(x)Cohen–Friendly圖,顯示在二維列聯表中行、列變量偏離獨立性的程度

mosaicplot(x)列聯表的對數線性回歸殘差的馬賽克圖

pairs(x)如果x是矩陣或是數據框,作x的各列之間的二元圖

plot.ts(x)如果x是類"ts"的對象,作x的時間序列曲線,x可以是多元的,但是序列必須有相同的頻率和時間

ts.plot(x)同上,但如果x是多元的,序列可有不同的時間但須有相同的頻率

hist(x)x的頻率直方圖

barplot(x)x的值的條形圖

qqnorm(x)正態分位數-分位數圖

qqplot(x,y)y對x的分位數-分位數圖

contour(x,y,z)等高線圖(畫曲線時用內插補充空白的值)

filled.contour(x,y,z)同上,等高線之間的區域是彩色的,並且繪制彩色對應的值的圖例

image(x,y,z)同上,但是實際數據大小用不同色彩表示

persp(x,y,z)同上,但為透視圖

stars(x)如果x是矩陣或者數據框,用星形和線段畫出

symbols(x,y,...)在由x和y給定坐標畫符號(圓,正方形,長方形,星,溫度計式或者盒形圖),符號的類型、大小、顏色等由另外的變量指定

termplot(mod.obj)回歸模型(mod.obj)的(偏)影響圖

heatmap(x)熱度圖

其他的包中可能也會提供額外的圖表類型,比如:

quantmod包提供的K線圖:chartSeries()

portfolio包提供的tree map(板塊層級圖):map.market(id, area, group, color)用矩形面積來表示數值,可用於分析磁盤空間占用

lattice包提供的平行坐標圖:parallel(data)

 

繪圖示例

> x = rnorm(10)
> y = rnorm(10)
> plot(x,y)

 

Screenshot

繪圖參數

很多時候,你可能需要調整圖形的顯示方式。R的繪圖參數幾乎可以定制圖形的任何顯示(如標題,坐標軸,顏色,字體等)。

R 擁有一個數目很大的圖形參數列表。該列表包括控制線條樣式,顏色,圖形排列和文字對齊等方面的參數。

更改圖形參數有兩種方式,一種是直接在繪圖函數中設置參數,這種方式只影響當前繪圖函數,但是不是所有的參數都能夠通過這種方式設置;另一種是通過par()函數設置,這種方式會影響當前繪圖設備上的所有圖形。

下面先看一個直接設置參數的例子:

>plot(x,y,type="b",main="main title",sub='sub title',xlab="x axis",ylab='y axis',asp=0.2)

 

1 $ screenshot

 

 

使用par()函數的例子:

opar <- par()#備份原來的繪圖參數

par(bg="lightyellow", col.axis="blue", mar=c(4, 4, 2.5, 0.25))

plot(x, y, xlab="Ten random values", ylab="Ten other values",

xlim=c(-2, 2), ylim=c(-2, 2), pch=22, col="red", bg="yellow",

bty="l", tcl=-.25, las=1, cex=1.5)

par(opar)#恢復原來的繪圖參數

 

 

通過?par可以查到所有參數的說明。下面列舉最常用的一些參數:

adj控制關於文字的對齊方式,0是左對齊,0.5是居中對齊,1是右對齊,值> 1時對齊位置在文本右邊的地方,取負值時對齊位置在文本左邊的地方;如果給出兩個值(例如c(0, 0)),第二個只控制關於文字基線的垂直調整

bg指定背景色(例如bg="red", bg="blue"; 用colors()可以顯示657種可用的顏 色名)

bty控制圖形邊框形狀,可用的值為: "o", "l", "7", "c", "u" 和"]" (邊框和字符 的外表相像);如果bty="n"則不繪制邊框

cex控制缺省狀態下符號和文字大小的值;另外,cex.axis控制坐標軸刻度數字大小,cex.lab控制坐標軸標簽文字大小,cex.main控制標題文字大小,cex.sub控制副標題文字大小

col控制符號的顏色;和cex類似,還可用:col.axis, col.lab, col.main, col.sub

font控制文字字體的整數(1: 正常,2: 斜體,3: 粗體,4: 粗斜體);和cex類似, 還可用: font.axis, font.lab, font.main, font.sub

las控制坐標軸刻度數字標記方向的整數(0: 平行於軸,1: 橫排,2: 垂直於軸,3: 豎排)

lty控制連線的線型,可以是整數(1: 實線,2: 虛線,3: 點線,4: 點虛線,5: 長虛線,6: 雙虛線),或者是不超過8個字符的字符串(字符為從"0"到"9"之間的數字)交替地指定線和空白的長度,單位為磅(points)或象素,例如lty="44"和lty=2效果相同

lwd控制連線寬度的數字

mar控制圖形邊空的有4個值的向量c(bottom, left, top, right), 缺省值 為c(5.1, 4.1, 4.1, 2.1)

mfcolc(nr,nc)的向量,分割繪圖窗口為nr行nc列的矩陣布局,按列次序使用各子窗口

mfrow同上,但是按行次序使用各子窗口(參照 4.1.2)

pch控制符號的類型,可以是1到25的整數,也可以是""里的單個字符

2 $ screenshot

ps控制文字大小的整數,單位為磅(points)

pty指定繪圖區域類型的字符,"s": 正方形,"m":最大利用

tck指定軸上刻度長度的值,單位是百分比,以圖形寬、高中最小一個作為基數; 如果tck=1則繪制grid

tcl同上,但以文本行高度為基數(缺省下tcl=-0.5)

xaxt如果xaxt="n"則設置x-軸但不顯示(有助於和axis(side=1, ...)聯合使用)

yaxt如果yaxt="n"則設置y-軸但不顯示(有助於和axis(side=2, ...)聯合使用)

低級繪圖命令

R還可以在現有圖形(通過高級繪圖命令繪制)的基礎上增加一些額外的顯示,如標題、繪制坐標軸、在特定的位置增加圖形(比如輔助線,擬合線)或文字等。

這些函數在R中稱為低級作圖命 令(low-level plotting commands)。一些常用的低級圖形命令包括:

 

scatter.smooth(x, y, …)LOESS(局部加權散點平滑)擬合曲線

points(x, y)添加點(可以使用選項type=)

lines(x, y)同上,但是添加線

text(x, y, labels,…)在(x,y)處添加用labels指定的文字;典型的用法是: plot(x, y, type=”n”); text(x, y, names)

mtext(text,side=3, line=0,…)在邊空添加用text指定的文字,用side指定添加到哪一邊(參照 下面的axis());line指定添加的文字距離繪圖區域的行數

segments(x0, y0,x1, y1)從(x0,y0)各點到(x1,y1)各點畫線段

arrows(x0, y0,x1, y1, angle= 30,code=2)同上但加畫箭頭,如果code=2則在各(x0,y0)處畫箭頭,如 果code=1則在各(x1,y1)處畫箭頭,如果code=3則在兩端都畫箭頭; angle控制箭頭軸到箭頭邊的角度

abline(a,b)繪制斜率為b和截距為a的直線

abline(h=y)在縱坐標y處畫水平線

abline(v=x)在橫坐標x處畫垂直線

abline(lm.obj)畫由lm.obj確定的回歸線

rect(x1, y1, x2, y2)繪制長方形,(x1, y1)為左下角,(x2,y2)為右上角

polygon(x, y)繪制連接各x,y坐標確定的點的多邊形

legend(x, y, legend)在點(x,y)處添加圖例,說明內容由legend給定

title()添加標題,也可添加一個副標題

axis(side, vect)畫坐標軸,side=1時畫在下邊,side=2時畫在左邊,side=3時畫在上邊,side=4時畫在右邊。可選參數at指定畫刻度線的位置坐標

box()在當前的圖上加上邊框

rug(x)在x-軸上用短線畫出x數據的位置

locator(n, type=”n”, …)在用戶用鼠標在圖上點擊n次后返回n次點擊的坐標(x, y);並可以在點擊處繪制符號(type=”p”時)或連線(type=”l”時),缺省情 況下不畫符號或連線

 

 

下面的例子中,使用plot(...,type="n")繪制一個“空白”的圖形, 然后用低級函數來添加點,坐標軸,標簽等:

opar <- par()#備份繪圖參數

par(bg="lightgray", mar=c(2.5, 1.5, 2.5, 0.25))#設置繪圖參數

plot(x, y, type="n", xlab="", ylab="", xlim=c(-2, 2),  ylim=c(-2, 2), xaxt="n", yaxt="n")#繪制“空白”圖形,設定坐標軸范圍

rect(-3, -3, 3, 3, col="cornsilk")#修改繪圖區域的顏色

points(x, y, pch=10, col="red", cex=2)#畫點

axis(side=1, c(-2, 0, 2), tcl=-0.2, labels=FALSE)#添加坐標軸

axis(side=2, -1:1, tcl=-0.2, labels=FALSE)

title("How to customize a plot with R (ter)",#添加標題

font.main=4, adj=1, cex.main=1)

mtext("Ten random values", side=1, line=1, at=1, cex=0.9, font=3)#繪制坐標軸標簽

mtext("Ten other values", line=0.5, at=-1.8, cex=0.9, font=3)

mtext(c(-2, 0, 2), side=1, las=1, at=c(-2, 0, 2), line=0.3,

col="blue", cex=0.9)

mtext(-1:1, side=2, las=1, at=-1:1, line=0.2, col="blue", cex=0.9)

par(opar)#恢復繪圖參數

 

3 $ screenshot

 

交互式繪圖命令

有時需要根據用戶的想法而不是數據進行繪圖,即交互式繪圖。R對此有很好的支持,允許用戶直接用鼠標在一個圖上提取和提交信息。

 

R中最簡單、最常用的函數是locator(n, type)。等待用戶用鼠標左鍵點擊n個位置,如果設置了type,還可以根據這n個位置直接進行低級繪圖。

比如:

x = rnorm(10)

plot(x)

locator(5,"o")

 

 

locator也可以先不繪圖,只把用戶點擊的坐標記錄下來:

r = locator(2)

r

 

 

另一個有意思的交互函數是identify(x, y, labels),可以參考幫助自己學習。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM