2018年5月10日 星期四

R 的視覺化之二:3D入門



R的立體3D繪圖,可分為靜態,互動與動態三種。這篇文章介紹靜態的兩種型態,互動式和動態另文介紹。
3D繪圖在財經數據上相當重要,尤其是期間結構商品,如果在接上時間序列,就會更繁複。我們先從簡單的開始。主要用兩個套件:scatterplot3d和plot3D。plot3D有更多可以表現的風格。資料還是用 reshape 套件內建的 tips

I. 使用 scatterplot3d
library(scatterplot3d)
tips=reshape::tips
names(tips)                                     
used=tips[,c("total_bill","size","tip")]

Case 1. 基本3D繪圖
scatterplot3d(used,main="3D Scatter Plot", xlab="Total bill",ylab="table size",zlab="Tip",pch=16, color="steelblue")

Case 2. 分組
   我們依照小費高低,用cut函數分成三群:L=Low tip, M=Medium tip, H=High tip。如下
group=cut(tips$tip,3,labels =c("L","M","H"))
   再給定形狀,就是pch使用的編號
myshapes=c(16,17,18)
   再把編號對應到樣本
myshapes=myshapes[as.numeric(group)] 
   給定三群對應顏色
mycols=c("green","blue", "red")
   再把三個色對應到樣本
mycols=mycols[as.numeric(group)]
scatterplot3d(used,main="3D Scatter Plot", xlab="Total bill",ylab="table size",zlab="Tip",pch=myshapes, color=mycols,box=FALSE,grid=TRUE)


Case 3. 添加 legends
須要上添加物時,必須先把圖物件存起來,下例為my3d
plot.new()
my3d=scatterplot3d(used,main="3D Scatter Plot", xlab="Total bill",ylab="table size",zlab="Tip",pch= 16, color=mycols)
第1個方法是指定座標,使用 xyx.convert()
legend(my3d$xyz.convert(50,5,4),legend=levels(group),col=c("green","blue", "red"),pch=16)
第2個方法是用文字 "bottom","center","right"等等。bty="n" 可取消 legend 框框。
legend("bottomright",legend=levels(group),col=c("green","blue", "red"),pch=16, bty="n")

第3個方法使用 inset指定 legend 和 origin 的距離。下圖同時也指定legend文字水平呈現。
legend("bottom",legend=levels(group),col=c("green","blue", "red"),pch=16:18,inset=-0.15, xpd=TRUE, horiz=TRUE, bty="n")

Case 4. 在不同面添加格線
這功能須要一個小工具graph3D,由git上裝置
devtools::install_github("kassambara/graph3d")
library(graph3d)
plot.new()
s3d=scatterplot3d(used,main="3D Scatter Plot", xlab="Total bill",ylab="table size",zlab="Tip",pch= "", box=FALSE,grid=FALSE)
   指定添加格線平面
s3d_addgrids(used, grid=c("xy","xz","yz"))
s3d$points3d(used,pch=myshapes, col=mycols)
繪圖如下:

上例中的繪圖,風格較少,同時顯示的角度調整不容易(基本上是不能調),plot3D則具備更多的功能。

II. 使用plot3D


library(plot3D)
宣告座標資料。
x=used$total_bill
y=used$size
z=used$tip

Case 1. 標準繪圖,如不需顯示右邊的色棒,colkey=FALSE就可以。
scatter3D(x,y,z,main="3D Scatter Plot", xlab="Total bill", ylab="table size", zlab="Tip", pch=18, clab=c("Tip, US$"), colkey=TRUE)


Case 2. 分組上色
scatter3D(x,y,z,main="3D Scatter Plot", xlab="Total bill",ylab="table size", zlab="Tip", pch=18, col.var=as.integer(group), col=c("#E69F00","#56B4E9", "#B2182B"), clab=c("Tip, US$"))

Case 3. 背景形式 bty="b2"
scatter3D(x,y,z,main="3D Scatter Plot", xlab="Total bill", ylab="table size", zlab="Tip", bty="b2", colkey=FALSE)
Case 4. 背景形式 bty="g" 是 ggplot2 的風格。
scatter3D(x,y,z,main="3D Scatter Plot", xlab="Total bill",ylab="table size", zlab="Tip", bty="g", cex=1.5, colkey=FALSE)
Case 5. 檢視角度,之前的圖,都是俯視,如果要平行檢視,則 phi=0。如下
scatter3D(x,y,z,main="3D Scatter Plot", xlab="Total bill",ylab="table size", zlab="Tip", bty="g", clab=c("Tip, US$"), pch=20, cex=2, phi=0)
Case 6.  在座標刻度做明確顯示,ticktype="detailed",這個圖也是這筆資料最佳的檢視圖。
scatter3D(x,y,z,main="3D Scatter Plot", xlab="Total bill",ylab="table size", zlab="Tip", bty="g", clab=c("Tip, US$"), pch=20,cex=2,phi=0, ticktype="detailed")


這個圖的分群方式,如果依照 time/day/sex 劃分的話,會呈現出更多的色聚型態,資料科學往往須要檢視型態。這技術就很有用。

資料最佳檢視角度個個不同,所以,互動式圖形就可以利用滑鼠來調整角度,更為簡便。下次的文就來介紹互動式繪圖套件。


沒有留言:

張貼留言