2

我正在制作一个 PCA,vegan{}并且我还想按因素标记我的点(而不是按它们的唯一行标识,这是 的默认值biplot.rda())。对于我的 2D PCA,我使用了Gavin Simpson建议的方法。我想问问聪明的 R 社区是否有这种方法的 3D 版本来创建自定义标签的 PCA。这是适用于 2D PCA 的方法:

#Relabel a la Gavin Simpson:
site.scr<-scores(dat.pca,display="sites",scaling=2,choices=c(1,2,3))
spp.scr<-scores(dat.pca,display="species",scaling=2,choices=c(1,2,3))

## generate x,y lims
xlims <- range(site.scr[,1], spp.scr[,1])
ylims <- range(site.scr[,2], spp.scr[,2])

## plot what you want, but leave out sites
biplot(dat.pca, display = "species", xlim = xlims, ylim = ylims)
points(site.scr[39:65,2:3],col="green",pch=1)   #These sites are in green
points(site.scr[1:38,2:3],col="brown",pch=3)        #These sites are in brown

我已经ordirgl()在我的一台计算机上完成了这项工作,但是有一些 R 版本/OS 组合不能很好地与 rgl 配合使用(这对许多人来说似乎是一个问题),所以我希望能够两者的情节rgl()ordiplot3d()

ordiplot3d(dat.pca, display = "species", scaling = 3)

这会将点绘制到 3D 空间上,而不是 biplot.rda 的向量上(第一个问题——当我使用 rgl 时我也遇到了这个问题——我认为这些点是在普通biplot.rda()PCA 中绘制的向量的末端)。这对我来说不是很关心,但如果有人知道如何在 ordirgl 中绘制这些向量并标记它们,我想知道。更大的问题是,一旦制作完成,我很难向 ordiplot3d 添加点。理想情况下,这将类似于points(). 我在几个不同的问题线程中看到了这一点,但如果有一个不需要 rgl 的优雅解决方案会很好。

4

2 回答 2

4

我编写了一个名为 pca3d ( http://cran.r-project.org/web/packages/pca3d/index.html )的小包,它也可以创建 3D 双图。我独立地缩放样本和变量,因此变量负载是直接可比的。但是,它是测试版,所以要小心。

在此处输入图像描述

于 2013-03-22T11:55:22.067 回答
3

首先是警告;目前用于绘制 3d 双图的基础代码(包scatterplot3d)不允许我们对所有轴进行相同的缩放。因此双标图不正确,因为第三个维度不能以与其他两个相同的单位进行缩放。Jari 为scatterplot3d包的维护者提供了一个补丁,允许对其进行控制,但我们正在等待它被接受等。

您缺少的是ordiplot3d()(因为它使用scatterplot3d())返回一个对象,该对象包含允许您将点等添加到现有 3d 散点图的函数。

这是一个例子

## continue example from ?biplot.rda
require(vegan)
## produces 'mod' 
example(biplot.rda)
## why do we need this?
par(ask = FALSE)

## grab the scores on axes you require; mod == your fitted rda/pca 
site.scr <- scores(mod, display = "sites", scaling = 3, choices = 1:3) 
spp.scr <- scores(mod, display = "species", scaling = 3, choices = 1:3)

## do the 3d plot but suppress plotting of the species,
## though plot is scaled to accommodate them
ordi <- ordiplot3d(mod, display = "species", scaling = 3, type = "n")

现在看看对象ordi它是一个复杂的对象返回函数,允许您向当前绘图添加点:

> str(ordi, max = 1)
List of 7
 $ xyz.convert   :function (x, y = NULL, z = NULL)  
 $ points3d      :function (x, y = NULL, z = NULL, type = "p", ...)  
 $ plane3d       :function (Intercept, x.coef = NULL, y.coef = NULL, lty = "dashed", lty.box = NULL, 
    ...)  
 $ box3d         :function (...)  
 $ origin        : num [1, 1:2] 1.67 1.33
 $ envfit.convert:function (object)  
 $ points        : num [1:30, 1:2] -0.146 2.776 1.291 3.102 2.816 ...
  ..- attr(*, "dimnames")=List of 2
 - attr(*, "class")= chr [1:2] "ordiplot3d" "ordiplot"

现在通过说明的方式,用一个颜色和一个圆圈绘制前 10 个物种,用points3d()返回的颜色绘制第二个 10 个不同的颜色和绘制字符等:

cols <- bgs <- c("red","green","blue")
pchs <- 21:23
ordi$points3d(spp.scr[1:10,1], spp.scr[1:10,2], spp.scr[1:10,3],
              col = cols[1], bg = bgs[1], pch = pchs[1])
ordi$points3d(spp.scr[11:20,1], spp.scr[11:20,2], spp.scr[11:20,3],
              col = cols[2], bg = bgs[2], pch = pchs[1])
ordi$points3d(spp.scr[21:30,1], spp.scr[21:30,2], spp.scr[21:30,3],
              col = cols[3], bg = bgs[3], pch = pchs[3])

产生:

向 3d 散点图添加点的示例

虽然请注意这不是一个真正的双标图,因为在将具有相等缩放的能力添加到scatterplot3d().

于 2012-05-23T12:54:08.980 回答