PCA、RDA等排序圖的一些三維視覺化示例

列舉幾種繪製三維散點圖的R包
前文已分享了PCACADCAPCoANMDSRDAdb-RDACAP)、CCA等排序方法在R語言中的計算過程。同時在分享過程中,每篇都對應了1-2例排序圖作圖示例,幫助大家掌握排序圖的繪製方法。
但是這些示例中所展示的基本都是二維散點圖,畢竟在實際中,大多數情況下有意義的都是前兩軸。但偶爾也會關注第三軸,歸因於它具有可觀的貢獻度或者明顯的排布特徵。本篇列舉幾種常用的繪製三維點圖的R包,實際情況中結合幫助文件除錯引數使用,或再配合AIPS等修圖工具,視覺化三軸的排序圖。
本篇主要以某PCA的結果為例繪圖展示。
示例檔案、R指令碼等的百度盤連結:
https://pan.baidu.com/s/1KUA5owf4y13y1RJbff-l7g
pca_site.txt”是某PCA分析的樣方(物件)排序座標,“pca_var.txt”是變數的座標。
scatterplot3d包繪製三維散點圖。
pca_site.txtgroup1區分顏色,按group2區分點的形狀。
#資料

pca_site <- read.delim('pca_site.txt', sep = '\t', stringsAsFactors = FALSE)

pca_var <- read.delim('pca_var.txt', sep = '\t', stringsAsFactors = FALSE)
#scatterplot3d 包,詳情 ?scatterplot3d

library(scatterplot3d)
scatterplot3d(pca_site$PC1, pca_site$PC2, pca_site$PC3, color = rep(c('red2', 'purple2', 'green3'), c(8, 8, 8)), pch = rep(rep(c(17, 15), c(4, 4)), 3), 

        xlab = paste('PCA1: 20%'), ylab = paste('PCA2: 12%'), zlab = paste('PCA3: 8%'))
scatterplot3d(pca_site[2:4], color = rep(c('red2', 'purple2', 'green3'), c(8, 8, 8)), lwd = 3, type = 'h',

        xlab = paste('PCA1: 20%'), ylab = paste('PCA2: 12%'), zlab = paste('PCA3: 8%'))

rgl包繪製三維散點圖,互動式風格便於觀測資料。
pca_site.txtgroup1區分顏色
#rgl 包,互動式,詳情 ?plot3d

library(rgl)
plot3d(pca_site[2:4], col = rep(c('red2', 'purple2', 'green3'), c(8, 8, 8)), size = 5)
#參考自:https://stackoverflow.com/questions/24282143/pca-multiplot-in-r

#有其它需要(如顏色選擇等),自定義修改即可

library(rgl)
plotPCA <- function(x, nGroup) {

    n <- ncol(x) 

    if(!(n %in% c(2,3))) { # check if 2d or 3d

        stop("x must have either 2 or 3 columns")

    }
    fit <- hclust(dist(x), method="complete") # cluster

    groups <- cutree(fit, k=nGroup)
    if(n == 3) { # 3d plot

        plot3d(x, col=groups, type="s", size=1, axes=F)

        axes3d(edges=c("x–", "y–", "z"), lwd=3, axes.len=2, labels=FALSE)

        grid3d("x")

        grid3d("y")

        grid3d("z")

    } else { # 2d plot

        maxes <- apply(abs(x), 2, max)

        rangeX <- c(-maxes[1], maxes[1])

        rangeY <- c(-maxes[2], maxes[2])

        plot(x, col=groups, pch=19, xlab=colnames(x)[1], ylab=colnames(x)[2], xlim=rangeX, ylim=rangeY)

        lines(c(0,0), rangeX*2)

        lines(rangeY*2, c(0,0))

    }

}
plotPCA(pca_site[2:4], nGroup = 3)

car包結合rgl包繪製三維散點圖,互動式風格便於觀測資料。
pca_site.txtgroup1區分顏色,同時按group1新增分組橢圓(注意這個橢圓不是置信區間,僅為標記分組的曲面)
#car+rgl 包,互動式,詳情 ?scatter3d

library(car)

library(rgl)
scatter3d(pca_site$PC1, pca_site$PC2, pca_site$PC3, surface = FALSE, point.col = rep(c('red2', 'purple2', 'green3'), c(8, 8, 8)), 

        xlab = paste('PCA1: 20%'), ylab = paste('PCA2: 12%'), zlab = paste('PCA3: 8%'))
scatter3d(pca_site$PC1, pca_site$PC2, pca_site$PC3, groups = as.factor(pca_site$group1), surface = FALSE, ellipsoid = TRUE, 

        xlab = paste('PCA1: 20%'), ylab = paste('PCA2: 12%'), zlab = paste('PCA3: 8%'))

還有廣泛熟知的plotly包繪製三維散點圖,互動式網頁的風格便於觀測資料。
pca_site.txtgroup1區分顏色,以及新增變數向量等。
#plotly 包,網頁互動式,詳情 ?plot_ly

library(plotly)
pca_site$color <- rep(c('red2', 'purple2', 'green3'), c(8, 8, 8))

plot_ly(pca_site, labels = ~name, x = ~PC1, y = ~PC2, z = ~PC3, color = ~color)
#新增變數向量

#參考自:https://stackoverflow.com/questions/44393823/3d-biplot-in-plotly-r

library(plotly)
p <- plot_ly() %>%

  add_trace(x = pca_site$PC1, y = pca_site$PC2, z = pca_site$PC3,

            type="scatter3d", mode="markers",

            marker = list(color=rep(c(1,2,3), each = 8), opacity = 0.7)) 
for (k in 1:nrow(pca_var)) {

   p <- p %>% add_trace(x=c(0, pca_var[k,'PC1']), y=c(0, pca_var[k,'PC2']), z=c(0, pca_var[k,'PC3']),

      type="scatter3d", mode="lines",

      line = list(width=3),

      opacity = 1) 

}
p

連結

相關文章