如何仅绘制NMDS中最丰富的物种?

时间:2019-07-11 10:00:25

标签: r vegan

我需要绘制一个排序图,只显示20个最丰富的物种。

我尝试对物种库伦求和,然后仅选择某个总和值:

abu <- colSums(dune)
abu
sol <- metaMDS(dune)
sol
plot(sol, type="text", display="species", select = abu > 40)

我收到此错误:select不是图形参数

我希望只能看到少数物种,但不会发生, 您如何在NMDS图中仅显示少数物种?

1 个答案:

答案 0 :(得分:1)

这并不简单。由于选择不是绘图的参数,因此出现错误。不幸的是,分析的结果不是可以轻松处理的data.frame(例如,使用tidyverse),更不幸的是,调用的plot()函数不是您的标准绘图,而是专门为此对象定义的方法类。该方法的作者没有预见到您的需要,因此,我们必须手动进行绘制。但是要做到这一点,我们需要了解什么是绘图以及如何绘图。

让我们进一步了解对象sol

class(sol)
# [1] "metaMDS" "monoMDS"
methods(class="metaMDS")
# [1] goodness    nobs        plot        points      print       scores      sppscores<- text

哦,好,我们有一种绘图方法。经过一会儿的挖掘,我们在vegan包中找到了它(未导出),因此我们需要通过vegan:::plot.metaMDS访问它。它似乎是一个称为ordiplot的函数的包装器。我们使用edit()编辑该函数以弄清楚它在做什么。本质上,它可以归结为以下内容(带有大量不必要的代码):

Y <- scores(sol, display="species")
plot(Y, type="n")
text(Y[,1], Y[,2], rownames(Y), col="red")

这或多或少是您的情节。现在选择要显示的物种是微不足道的,但是首先我们必须确保Y的行与沙丘的列的顺序相同:

all(colnames(dune) == rownames(Y))
Y.sel <- Y[colSums(dune) > 40, ]
plot(Y.sel[,1], Y.sel[,2], type="n", xlim=c(-.8, .8), ylim=c(-.4, .4))
text(Y.sel[,1], Y.sel[,2], rownames(Y.sel), col="red")

enter image description here

我们当然可以做得更好。例如,使用ggplot(当然也可以使用底数R绘制更好的图)。实际上,我们可以使用尺寸美学来显示植物的丰富度:

library(ggplot2)
library(ggrepel)

Y <- data.frame(Y)
Y$abundance <- colSums(dune)
Y$labels <- rownames(Y)

ggplot(Y, aes(x=NMDS1, y=NMDS2, size=abundance)) +
   geom_point() + geom_text_repel(aes(label=labels)) + 
   theme_minimal()

enter image description here

要按数量过滤物种,我们现在可以执行以下操作:

library(tidyverse)
Y %>% filter(abundance > 40) %>%
  ggplot(Y, aes(x=NMDS1, y=NMDS2, size=abundance)) +
    geom_point() + geom_text_repel(aes(label=labels)) + 
    theme_minimal()