我需要绘制一个排序图,只显示20个最丰富的物种。
我尝试对物种库伦求和,然后仅选择某个总和值:
abu <- colSums(dune)
abu
sol <- metaMDS(dune)
sol
plot(sol, type="text", display="species", select = abu > 40)
我收到此错误:select不是图形参数
我希望只能看到少数物种,但不会发生, 您如何在NMDS图中仅显示少数物种?
答案 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")
我们当然可以做得更好。例如,使用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()
要按数量过滤物种,我们现在可以执行以下操作:
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()