我正在使用vegan{}
创建一个PCA,我还希望用因子标记我的点数(而不是它们唯一的行标识,这是biplot.rda()
的默认值)。对于我的2D PCA,我使用了Gavin Simpson建议的here方法。我想问明智的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版本/操作系统组合与rgl不兼容(对于很多人来说这似乎是一个问题),所以我希望能够在rgl()
和ordiplot3d()
ordiplot3d(dat.pca, display = "species", scaling = 3)
这绘制了3D空间的点,而不是biplot.rda的向量(第一个问题 - 当我使用rgl时我也有这个问题 - 我认为这些点是在正常情况下绘制的向量的末端{ {1}} PCA)。这对我来说并不是一个问题,但如果有人知道如何在ordirgl中绘制这些向量并标记它们,我想知道。
更大的问题是,我很难在ordiplot3d上添加积分。理想情况下,这将是biplot.rda()
。我已经在几个不同的问题主题中看到了这一点,但是拥有一个不需要rgl的优雅解决方案会很不错。
答案 0 :(得分:4)
我写了一个名为pca3d(http://cran.r-project.org/web/packages/pca3d/index.html)的小包,它也可以创建3D双点。我独立地缩放样本和变量,因此可变负载是可直接比较的。但是,它是测试版,所以要小心。
答案 1 :(得分:2)
首先警告;目前,用于绘制3d biplots的基础代码(包 scatterplot3d )不允许我们将所有轴缩放相同。因此,双标图不正确,因为第三维不能以与其他两个相同的单位进行缩放。 Jari已经为 scatterplot3d 包的维护者提供了一个补丁,允许对其进行控制,但我们正在等待它被接受等。
您缺少的是ordiplot3d()
(因为它使用scatterplot3d()
)会返回一个对象,该对象包含允许您将点等添加到现有三维散点图的函数。
这是一个例子
## 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"
现在通过举例说明,使用返回的points3d()
绘制前10个具有颜色和圆形的物种,第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])
产生:
虽然请注意这不是一个真正的双标图,因为第3轴(z)上的缩放是错误的,直到scatterplot3d()
添加了相等缩放的能力。