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

时间:2017-11-27 17:16:51

标签: r plot ggplot2 vegan

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

然而我的问题是我很难弄清楚如何使用ggplot绘制群集图形。我环顾四周,最接近的是这个: R - add centroids to scatter plot

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

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

2 个答案:

答案 0 :(得分:6)

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

library('vegan')
library('ggplot2')

对于这个例子,我将使用素食主义者附带的荷兰沙丘草甸数据集

data(dune, dune.env)

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

首先是示例排序

ord <- metaMDS(dune)

接下来,提取NMDS分数

scrs <- scores(ord, display = 'sites')

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

scrs <- cbind(as.data.frame(scrs), Management = dune.env$Management)

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

cent <- aggregate(cbind(NMDS1, NMDS2) ~ Management, data = scrs, FUN = mean)

要绘制蜘蛛,我们需要geom_segment(),这需要协调员从和绘制段。我们的坐标,xendyend美学将成为质心。因此,我们需要为组中的每个观察复制组质心。我们通过merge左侧加入促进了这一点:

segs <- merge(scrs, setNames(cent, c('Management','oNMDS1','oNMDS2')),
              by = 'Management', sort = FALSE)

请注意我重命名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

哪个产生

enter image description here

答案 1 :(得分:1)

您可以在GitHub包ggordiplots(https://github.com/jfq3/ggordiplots)中使用gg_envfit函数。 john-quensen.com的GitHub页面上有包文档和小插图的链接。包中的所有函数都会静默返回您可能用于进行自己的绘图修改的数据框。这包括一个小插曲。