前面一個帖子我們學習了畫基本的PCA圖形,但是是二維的,今天我們學習繪制三維的,因為在有些paper中看到作者放的是三維的,其實也挺好看的。主成分的計算方法上一個帖子講過了,就不多講了。
計算過主成分后,自己提取一下前面3個PC就成了。這個是我們今天的測試數據。

其實繪制3維圖形的包也很多,我們先測試一個R里面經常用的scatter3D。
先繪制基本的三維PCA圖。
scatter3D(x = plot.data$DC_1, y = plot.data$DC_3, z = plot.data$DC_2,
? ? ? ? ? xlab = "DC_1",? #設置x,y,z坐標軸的名稱
? ? ? ? ? ylab = "DC_3",
? ? ? ? ? zlab = "DC_2",
? ? ? ? ? pch=21, #當pch取0~14時,其點為空心點,可以用col(顏色)參數設置其邊框的顏色;當pch取15~20時,其點是實心點,可以用col參數設置其填充的顏色;當pch取21~25時,其點也是實心點,既可以用col參數設置邊框的顏色,也可以用bg參數設置其內部的填充顏色。
? ? ? ? ? cex=1.5, #大小
? ? ? ? ? col = "white", #設置點邊框的顏色
? ? ? ? ? bg = plot.data$color #設置點的填充色
? ? ? ? )

我們下面調整一些詳細的參數來控制細節(jié)。
scatter3D(x = plot.data$DC_1, y = plot.data$DC_3, z = plot.data$DC_2,
? ? ? ? ? xlab = "DC_1",? #設置x,y,z坐標軸的名稱
? ? ? ? ? ylab = "DC_3",
? ? ? ? ? zlab = "DC_2",
? ? ? ? ? pch=21,#當pch取0~14時,其點為空心點,可以用col(顏色)參數設置其邊框的顏色;當pch取15~20時,其點是實心點,可以用col參數設置其填充的顏色;當pch取21~25時,其點也是實心點,既可以用col參數設置邊框的顏色,也可以用bg參數設置其內部的填充顏色。
? ? ? ? ? cex=2, #大小
? ? ? ? ? col = "white", #設置點邊框的顏色
? ? ? ? ? bg = plot.data$color, #設置點的填充色
? ? ? ? ? bty = "f", #控制繪制框的外型,可以為“b”, “b2”, “f”, “g”, “bl”, “bl2”, “u”, “n”其中的一個
? ? ? ? ? ticktype = "detailed", #顯示坐標軸的刻度
? ? ? ? ? theta = -20, #旋轉角度
? ? ? ? ? phi=0, #控制三維圖的上下方向
? ? ? ? ? d=3, #透視轉換強度
? ? ? ? ? cex.axis = 1.2, cex.lab = 2? ?#調控坐標軸刻度以及文字的大小?
? ? ? ? )
legend(x=0.6,y=0.2,title =? "Group",legend=paste("G",c(1:10),sep=""),pch=21,cex=2,y.intersp=1,pt.bg = unique(plot.data$color),bg="white",bty="n")

下面我們再來測試2個可以畫3維PCA的其它包。
install.packages('devtools')
devtools::install_github("AckerDWM/gg3D")
library(gg3D)
安裝好gg3D包后,其實這個包是基于ggplot的,可以查看幫助發(fā)現只有5個函數分別為:axes_3D 繪制3D坐標軸,axis_labs_3D 標記坐標刻度,labs_3D標記坐標標簽,stat_3D 繪制幾何對象,stat_wireframe繪制3D線框或3D曲面。
可以使用labs_3D添加軸標題。使用hjust,vjust和angle來實現良好的定位。
可以使用axis_labs_3D添加軸標簽。標簽顯示每個軸的最小值和最大值。同樣,可以使用hjust,vjust和angle來實現良好的定位。
#theta控制旋轉,phi控制圖的傾斜
theta <- -20 #方位角的度數
phi <- 0 # 漸近線
colors <- unique(plot.data$color)
names(colors) <- colors
ggplot(plot.data, aes(x = DC_1, y = DC_3, z = DC_2, color = color)) +
? axes_3D(theta=theta, phi=phi) +
? stat_3D(theta=theta, phi=phi) +
? labs_3D(theta=theta,
? ? ? ? ? phi=phi,
? ? ? ? ? hjust=c(1,1,0),
? ? ? ? ? vjust=c(1.5,1,-.2),
? ? ? ? ? labs=c("DC_1", "DC_2", "DC_3")) +
? scale_color_manual(values = colors,labels=unique(plot.data$Group))+
? theme_void()+
? theme(text = element_text(size = 20))

當然還有其它的包,例如scatterplot3d:
scatterplot3d(x = plot.data$DC_1,
? ? ? ? ? ? ? y = plot.data$DC_3,
? ? ? ? ? ? ? z = plot.data$DC_2,
? ? ? ? ? ? ? #color = plot.data$color,
? ? ? ? ? ? ? xlab = "DC_1", ylab = "DC_3", zlab = "DC_2",
? ? ? ? ? ? ? pch = 21,? #點的類型
? ? ? ? ? ? ? bg=plot.data$color, #對于pch 21-25 點的填充色
? ? ? ? ? ? ? angle = 120, #控制旋轉角度
? ? ? ? ? ? ? scale.y = 0.7,
? ? ? ? ? ? ? grid=T,? #是否畫網格線
? ? ? ? ? ? ? cex.symbols = 1.5, #點的大小
? ? ? ? ? ? ? col.axis = "#444444",col.grid = "#CCCCCC",col.lab="black" #axis/grid/axis labels的顏色
)
