4.1 R繪圖概述
以下兩個函數,可以分別展示二維,三維圖形的示例:
>demo(graphics)
>demo(persp)
R提供了多種繪圖相關的命令,可分成三類:
高級繪圖命令:在圖形設備上產生一個新的圖區,它可能包括坐標軸、標簽、標題等。
低級繪圖命令:在一個己經存在的圖形上加上更多的圖形元素,如額外的點、線和標簽。
交互式圖形命令:允許交互式地用鼠標在一個已經存在的圖形.上添加圖形信息或者提取圖形信息。
使用R語言作圖,主要按照以下步驟進行:
①取原始數據,准備好繪圖需要的變量。
②如有需要,對繪圖區域進行設置、分割。
③繪制圖形,例如創建坐標軸井繪制點圖、曲線或其他類型的圖。
④標注圖形。對圖形進行標注,包括在圖形中添加標題、坐標軸標注、文字標注等。
⑤設置圖形格式,添加圖例。包括設置圖形中的線寬、線型、顏色,標一記點的形狀、大小、顏色,以及坐標軸格式等。
⑥保存和導出圖形。按指定文件格式、屬性保存或導出圖形,以備以后使用。
4.2繪圖區域分割
主要有三個函數par(), layout(), spiit.screen()可以完成圖形區域的分割。
4.2.1函數par()
函數par() 可以將繪圖區域分割成規則的幾部分,例如par(mfrow=c(3,2))將圖形區域分成3X2的多重圖框,每塊.顯示一個圖形,按行顯示,也可以使用mfcol按列輸入圖形。
4.2.2函數layout()
layout()內部的參數是一個矩陣(matrix ),其通過定義矩陣來靈活地將圖形區域進行分割,matrix默認按列輸入。
layout(mat, widths = rep.int(1,ncol(mat)),heights = rep.int(1, nrow(mat)), respect = FALSE)
mat為矩陣,用於設置窗口的划分,矩陣的0元素表示該位置不畫圖,非0元素必須包括從1開始的連續整數值,比如,1,2,...,N,按非0元素的大小設置圖形的順序。widths用來設置窗口不同列的寬度,heights設置不同行的高度。例如:
layout(matrix(1:4,2,2))#將繪圖區域分成2X2的多重圖框。
layout(matrix(c(1,3,2,3),2,2))#將圖形區域分成三個不規則的區域。
layout(matrix(c(1,1,2,3,2,3),2,3))#將圖形區域分成如下的不規則區域。
分割完成后,通過指令layout.show(3)可以查看區域分割后的結構。要取消圖形區域分割,輸入指令layout(1)
4.2.3函數split.screen()
split.screen()同樣由向量或矩陣靈活控制區域的分割方式。
>split.screen(c (2,1)) #釋將圖形區域分成上下兩部分顯示
[1] 1 2
>split.screen(c(1,2),screen=2)#將第二部分(下半區)又分割成兩個區域
[1]3 4
>screen(1)#准備在第一個區域繪圖
4.3二維圖形
4.3.1高級繪圖函數
1.函數plot()
plot()是最常用的高級繪圖函數,這是一個泛型函數,其產生的圖形依賴於參數的類型。
其他高級繪圖函數:
高級繪圖函數的參數設置:
函數hist()
hist(x, breaks = "Sturges",freq = NULL,probability= !freq,include.lowest = TRUE, right = TRUE,density = NULL, angle = 45, col = NULL, border = NULL,main = paste("Histogram of" , xname),xlim = range(breaks), ylim = NULL,xlab = xname, ylab,axes = TRUE, plot = TRUE, labels = FALSE,nclass = NULL, warn.unused = TRUE, ...)
4 .3.2多元數據繪圖
> data(warpbreaks)
> coplot(breaks~1:54|wool*tension,data=warpbreaks,col="red",bg="pink",pch=21,bar.bg=c(fac="lightblue"))
4.3.3低級繪圖函數
利用高級函數畫出基本圖形后,可使用低級繪圖函數添加新的圖形元素,如點、圖例、標鑒等
4 .3.4圖形美化
4.3.5交互式繪圖命令
R的交互式函數允許用戶直接用鼠標在一個圖上提取和提交信息,最簡單、最常用的函數是:
Locator(n,type="n",…)
> x=rnorm(10)
> plot(x)
> locator(5,"o",col="red")
$x
[1] 1.929092 4.018157 6.998556 10.034663
[5] 7.945598
$y
[1] 1.21499224 0.97074910 0.43574030
[4] 0.05192964 -0.70406106
R中另一個比較有意思的交互函數是identify()它用於在散點圖中找出點。輸入它之后,系統讀取在圖中鼠標按下時指針的坐標位置,然后搜索(x,y)指定的坐標點,如果這一點足夠接近指針的位置,那么將在圖中返回指定的圖形元素。 identify(x, y, labels,…)
4.4三維圖形
R中繪制三維圖形的基本函數有三個,分別為:
image(x,y,z),產生長方形的網格,以不同顏色表示z的值。
contour(x,y,z),以等高線表示z的值。
persp(x,y,z),產生3D表面。
4.5 lattice程序包
lattice適用於多個變量的數據集繪圖,其中的大部分函數是以一個公式作為主要的自變量.
例如y~x|z表示繪制Y關於x的圖,並以變量z為分類依據,畫出多個圖。
> library(ggplot2)
> library(lattice)
> data(diamonds,package="ggplot2")
> sample=diamonds[sample(nrow(diamonds),1000),]
> xyplot(price~carat,data=sample,groups=cut,auto.key=list(corner=c(1,0)),type=c("p","smooth"),span=.7,main="PriceVS. Carat")
為了更好地按某一分類變量去比較數據,有些時候也需要分割圖形區域。使用lattice繪圖時,分割繪圖區域的操作變得很簡單,只要設置參數layout即可。lattice中含有繪制三維圖形的函數,其中cloud()用於繪制三維散點圖,與plot3d()效果相似,但可以進行分組繪圖:wireframe()用於繪制3D表面圖,它與基礎包中的persp()效果相似。
> x=seq(-pi,pi,len=20)
> y=seq(-pi,pi,len=20)
> g=expand.grid(x=x,y=y)
> g$z=sin(sqrt(g$x^2+g$y^2))
> wireframe(z~x*y,data=g,drape=TRUE,aspect=c(3,1),colorkey=TRUE,main=expression(z=sin(sqrt(g$x^2+g$y^2))))
4.6 ggplot2程序包
ggplot2是R中用於繪圖的高級程序包,它將繪圖視為一種映射—數學空問到圖形元索空間的映射,例如將不同的數值映射為不同的顏色或其他圖形屬性。ggplot2在畫圖時就是采用了類似photoshop的圖層設計方式,允許用戶一步步構建圖形,並且便於圖層的修改。
4.6.1快速繪圖
qplot(x, y = NULL, ..., data, facets =NULL, margins = FALSE,geom = "auto", stat = list(NULL), position =list(NULL), xlim = c(NA,NA), ylim = c(NA, NA), log = "", main = NULL,xlab= deparse(substitute(x)), ylab = deparse(substitute(y)), asp = NA)
以diamonds數據集為例:
> sample=diamonds[sample(nrow(diamonds),200),]
> qplot(carat,price,data=sample,shape=cut,color)
在上述散點圖中添加一條平滑曲線,通過method參數可以指定曲線擬合的方法,默認為method="loess"--平滑局部回歸。參數span控制曲線的平滑程度,取值越大曲線越平滑。
> qplot(carat,price,data=sample,geom=c("point","smooth"),span=.3)
使用qplot()對變量carat畫出更美觀的直方圖:
> qplot(carat,data=diamonds,geom="histogram",binwidth=.1,xlim=c(0,3),fill=color)
4.6.2分圖層繪圖
(1)數據和映射
ggplot(data,mapping=aes(x,y, <otheraesthetics>))
其中,data指定數據集:參數mapping用於構建映射,通常使用函數aes( )來指變量,還可以指定其他分類變量,如顏色,形狀,大小等。
> sample=diamonds[sample(nrow(diamonds),1000),]
>p=ggplot(data=sample,mapping=aes(x=carat,y=price,color=clarity))#定義的第一圖層存儲於p中
(2)幾何對象
基本圖層確定了數據源和映射后,通過加號(+)就可以不斷地添加新圖層.第二圖層添加幾何對象類的函數,在圖中繪制圖形元素其他類型的圖形,如直方圖、箱線圖等。如點、線、多邊形等,還可以用來繪制.
上面函數內部的基本參數都是一樣的。以散點圖為例:
geom_point(mapping=NULL,data=NULL,stat=”identity”,position=”identity”,na.rm=FALSE,…)
參數mapping用於構建映射,data指定數據集,如果在第一圖層己經指定,則可以省略:stat用於這一層數據的統計變換:position用於這一層圖形的位置調整,常用於條形圖(bar)和直方圖,取值為“identity”時表示直接顯示," dodge”為按分類變量並列放置," stack”為堆疊放置,"fill”顯示相對比例;" jitter”為增加擾動,常用於散點圖,防止圖形過分重疊。
> p+geom_point()+geom_smooth()
對上面的圖形進行整體平滑:
> p=ggplot(data=sample,aes(x=carat,y=price))
> p+geom_point(aes(color=clarity))+geom_smooth()
進行數據映射時,函數aes()可用於設置圖形樣式,通過參數color,shape和size分別設置點的顏色、形狀和大小按哪些向量分類,通過這些參數,即使一個簡單的散點圖也可以傳遞大量信息。
>sample=diamonds[sample(nrow(diamonds),100),]
>p=ggplot(data=sample,aes(x=carat,y=price))
>p+geom_point(aes(color=color,shape=cut,size=clarity),alpha=.5,position="jitter")
(3)標度
標度負責控制圖形屬性的顯示方式,主要包括設置坐標軸刻度,修改顏色取值、圖例樣式等。使用標度類的函數,相當於添加一個新的圖層,因此仍然用“+”連接函數,除了基本圖層ggplot()其他圖層的設置都可以應用於函數qplot()
設置坐標軸樣式的標度函數一般以“scale x"開頭
(4)統計變換
統計變換函數以“stat”開頭,它們可以對原始數據進行某種函數變換,是非常重要的功能。我們可以自定義函數,基於原始數據計算並在圖上表現出來,也可以通過它們改變“geom_函數畫圖的默認統計參數。
例如用stat_smooth對數據作loess平滑,在carat-price散點圖上添加非線性回歸線。
> sample=diamonds[sample(nrow(diamonds),1000),]
> ggplot(sample,aes(x=carat,y=price))+geom_point()+scale_y_log10()+stat_smooth()
第二圖層添加散點;第三圖層對Y軸作log10變換;第四圖層添加平滑的統計變換
(5)分面
當我們想要觀察某一分類變量對數據的影響情況時,僅通過shape, color區分是不夠的,需要根據變量的不同取值進行分組、分別繪圖。這時就要用到facet數,它控制數據分組的方法和排列形式,進行條件繪圖。
常用的函數是facet_wrap(~x, ncol),其中x表示分組變量,ncol表示圖形的排列方式,即分成幾列。也可以用facet_grid(x~.)替代。
> ggplot(sample,aes(x=carat,y=price))+geom_point(aes(colour=cut))+scale_y_log10()+stat_smooth()+facet_wrap(~cut,ncol=3)
(6)坐標系統
4.7圖形保存
完成繪圖后,最后一步是按照指定文件格式、屬性保存和導出圖形,以備以后使用。R繪制好的圖可以保存成多種格式,對應的生成函數名即它的擴展名。可生成的文件格式有png jpeg和pdf:
png(file="myplot.png”,bg="transparent")
jpeg(file="myplot.jpeg”)
pdf(file="myplot.pdf”)
生成文件后,默認在后台掃一開,所以查看圖形文件前需要用dev.off()關閉文件
此外,程序包ggplot2中的函數ggsave()也用於保存圖形,並且可以指定為不同的文件類型。
ggsave(filename=default_name (plot),plot=last_plot(),
device=default_device(filename),path=NULL, scale=1,…)
filename指定生成文件的路徑、名稱及擴展名,文件路徑也可以通過path設置;plot填寫圖形對象,默認為最后顯示的圖形:device指定要使用的設備,自動提取文件擴展名;scale為比例因子。將上面的餅圖保存成一個pdf文件,只需要一條簡單的指令就可以完成。
>ggsave(filename="d:/data/pie.pdf")
這樣就生成了一個pdf文件,還可把圖形保存成.png格式。