如何使用nmds在ggplot中获得类似ordispider的集群?

Leo*_*ama 2 plot r ggplot2 vegan

我刚刚成功地在非度量多维尺度图上绘制了图和ordisurf模型.代码来自本网站. https://oliviarata.wordpress.com/2014/07/17/ordinations-in-ggplot2-v2-ordisurf/

但是我的问题是我很难弄清楚如何使用ggplot绘制群集图形.我环顾四周,最接近我的是: R - 添加质心来分散情节

答案涉及创建质心并将线从它延伸到点,但这不是用nmds对象完成的,所以我仍然感到困惑.

我用素食主义者来运行我的nmds和gpplot进行绘图.我会添加我的数据,但它由两个非常大的社区和环境数据集组成.nmds和随后的ordisurf函数需要运行完整数据.

Rei*_*son 7

这是一种方法,它应该在某些时候进入我的ggvegan包.

library('vegan')
library('ggplot2')
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我将使用荷兰沙丘草甸数据集与素食主义者一起运送

data(dune, dune.env)
Run Code Online (Sandbox Code Playgroud)

我将使用Management变量dune.env作为我的集群成员资格向量.注意它被编码为一个因子; 您应该确保您使用的任何集群成员资格向量都是相同的.

首先是示例排序

ord <- metaMDS(dune)
Run Code Online (Sandbox Code Playgroud)

接下来,提取NMDS分数

scrs <- scores(ord, display = 'sites')
Run Code Online (Sandbox Code Playgroud)

为了便于计算质心,我将其Management作为变量添加到分数的数据框中

scrs <- cbind(as.data.frame(scrs), Management = dune.env$Management)
Run Code Online (Sandbox Code Playgroud)

现在我们计算组质心,它们是每个轴上的平均坐标,groupwise:

cent <- aggregate(cbind(NMDS1, NMDS2) ~ Management, data = scrs, FUN = mean)
Run Code Online (Sandbox Code Playgroud)

为了吸引蜘蛛,我们需要我们geom_segment()需要coordiates绘制段.我们坐标,xend以及yend美学将成为重心.因此,我们需要为组中的每个观察复制组质心.我们通过左连接促进merge:

segs <- merge(scrs, setNames(cent, c('Management','oNMDS1','oNMDS2')),
              by = 'Management', sort = FALSE)
Run Code Online (Sandbox Code Playgroud)

注意我重命名列,cent所以这些不会混淆相同名称的列scrs- 我们希望这些质心变量具有不同的名称.

现在我们可以策划

ggplot(scrs, aes(x = NMDS1, y = NMDS2, colour = Management)) +
  geom_segment(data = segs,
               mapping = aes(xend = oNMDS1, yend = oNMDS2)) + # spiders
  geom_point(data = cent, size = 5) +                         # centroids
  geom_point() +                                              # sample scores
  coord_fixed()                                               # same axis scaling
Run Code Online (Sandbox Code Playgroud)

哪个产生

在此输入图像描述