Как вывести на карту только самые распространенные виды в NMDS? - PullRequest
1 голос
/ 11 июля 2019

Мне нужно построить график ординации, показывающий только, скажем, 20 наиболее распространенных видов.

Я попытался составить сумму столбца видов, а затем выбрать только определенное значение суммы:

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

Я получаю эту ошибку: выбор не является графическим параметром

Я ожидаю увидеть только небольшое количество видов, но этого не происходит, как показать только небольшое количество видов вСюжет NMDS?

1 Ответ

1 голос
/ 12 июля 2019

Это не просто. Вы получаете ошибку, потому что select не является параметром для графика. К сожалению, результатом анализа является не 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()
...