查看原文
其他

PCA、RDA等排序图的一些三维可视化示例

生信小白鱼 鲤小白 小白鱼的生统笔记 2022-05-08
列举几种绘制三维散点图的R包
前文已分享了PCACADCAPCoANMDSRDAdb-RDA(CAP)、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.txt”的group1区分颜色,按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.txt”的group1区分颜色。

#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.txt”的group1区分颜色,同时按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.txt”的group1区分颜色,以及添加变量向量等。

#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



链接

RDA、db-RDA(CAP)及CCA的变差分解

R包vegan的典范对应分析(CCA)

典范对应分析(CCA)与去趋势典范对应分析(DCCA)概述

R包vegan的基于距离的冗余分析(db-RDA)

R包vegan的冗余分析(RDA)

群落分析的冗余分析(RDA)概述

R包vegan实现在物种多度的非约束排序中被动拟合环境变量

R包vegan的非度量多维标度(NMDS)分析

R包vegan的主坐标分析(PCoA)

R包vegan的群落去趋势对应分析(DCA)

R包vegan的群落对应分析(CA)

R包vegan的群落PCA及tb-PCA分析



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存