построение векторов на MDS с использованием ggplot - PullRequest
0 голосов
/ 02 сентября 2018

Мне нужно построить MDS с векторами, показывающими изменения в численности для моего вида. Мне нужен сюжет только с векторами

Это мои данные с избытком по каждому виду и коду

library(vegan)

A <- c(54.67, 37.67, 19.33, 0, 6, 8, 84.67, 0,0,0,0,0,0,0)
B <- c(3.67, 10.33, 32.67, 5.33, 20.33, 5.33, 4.67, 3, 4, 0.01, 0.1, 0, 5, 0)
C <- c(10, 1.67, 2.67, 1.67, 11.33, 1.33, 1, 2, 2.77, 0, 0.02, 1,3,0)
D <- c(1,10.33, 2.33, 28.33, 29.33, 4.33, 21, 6.97, 4.47, 0, 0.16, 11, 4,0)
df <- cbind(A, B, C, D)
row.names(df) <- c('B_2016', 'Emb_2016', 'Fes_2016', 'Ku_2016', 'Ra_2016', 'Ud_2016',
                   'Ve_2016', 'Ba_2017', 'Emb_2017', 'Fes_2017', 'Ku_2017', 'Ra_2017', 
                   'Ud_2017', 'Ve_2017')

mds <- metaMDS(df, distance='bray')

Я использую эти коды для создания кадра данных

mdspoints <- data.frame(scores(mds))
mdsvectors <- data.frame(mds$species)

и это код, который я использую для построения графика

g <- ggplot(data = mds, aes(MDS1, MDS2)) + 
  geom_segment(data = mdsvectors, aes(x=0, xend=MDS1, y=0, yend=MDS2),
               arrow = arrow(length = unit(0.5, "cm")),
               colour="grey", inherit_aes = FALSE) + 
  geom_text(data=mdspoints, aes(x=MDS1, y=MDS2, label=species), size=5)

но я ничего не могу отобразить и получить ошибку (Ошибка: ggplot2 не знает, как обращаться с данными класса metaMDS / monoMDS).

Я бы хотел что-то вроде этого

Спасибо

1 Ответ

0 голосов
/ 02 сентября 2018

Я не совсем точно понимаю, к чему вы стремитесь, основываясь на вашем коде, но вот некоторые вещи, которые вы можете принять к сведению.

Точка 1: не помещайте ничего в вызов верхнего уровня ggplot(), если только вы не хотите, чтобы последующие слои унаследовали его.

Вместо:

g <- ggplot(data = mds, aes(MDS1, MDS2)) + 

Использование:

g <- ggplot() + 

Вы уже создали фреймы данных mdspoints & mdsvectors, и ни один из ваших слоев geom не требует ничего от mds. Вам действительно не нужно здесь. Но поскольку он там , ggplot проверит его.

Если бы mds был фреймом данных, он прошел бы проверку ggplot и был бы проигнорирован, поскольку последующим слоям это не нужно. Однако это объект metaMDS / monoMDS, в результате чего ggplot выдает ошибку, которую вы видели.

Пункт 2. Проверьте, соответствуют ли ваши кадры данных ожидаемым.

Ваш код содержит следующую строку:

  geom_text(data=mdspoints, aes(x=MDS1, y=MDS2, label=species), size=5)

Это говорит ggplot, что для построения меток следует посмотреть на фрейм данных mdspoints и найти переменные с именем MDS1 / MDS2 / species.

Это то, что на самом деле было создано из mdspoints <- data.frame(scores(mds)):

> mdspoints
             NMDS1         NMDS2
B_2016   -141.6526 -6.290613e-01
Emb_2016 -141.8424 -3.280861e-01
Fes_2016 -142.1144 -4.456856e-01
Ku_2016  -141.8335  3.674413e-01
Ra_2016  -141.8977  2.283486e-02
Ud_2016  -141.8824 -1.480702e-01
Ve_2016  -141.5302 -3.732303e-01
Ba_2017  -141.9265  2.233302e-01
Emb_2017 -141.9695  1.210940e-01
Fes_2017 -140.6462  1.430899e-01
Ku_2017  -141.8616  2.216499e-01
Ra_2017  -141.7638  7.116520e-01
Ud_2017  -142.0109  1.130730e-01
Ve_2017  1842.9317 -3.167902e-05

Итак, NMDS1 / NMDS2 вместо MDS1 / MDS2, и нет названия столбца для "видов". Названия строк соответствуют видам? Я не уверен, так как сам не использую пакет vegan, но быстрый взгляд на файл справки для его функции scores() обнаруживает следующее:

## Default S3 method:
scores(x, choices, display=c("sites", "species"), ...)

Что говорит о том, что это могут быть баллы для сайтов , а не видов . Если это понимание верно, вы захотите указать «виды» при создании mdspoints и вручную создать столбец species из имен строк:

mdspoints <- data.frame(scores(mds, "species"))
mdspoints$species <- row.names(mdspoints)

Результат

Вот как может выглядеть сюжет:

ggplot() + 
  geom_segment(data = mdsvectors, aes(x=0, xend=MDS1, y=0, yend=MDS2),
               arrow = arrow(length = unit(0.5, "cm")),
               colour="grey") +
  geom_text(data=mdspoints, aes(x=NMDS1, y=NMDS2, label=species), size=5) +
  labs(x = "NMDS1", y = "NMDS2") + # add axis labels
  theme_classic()                  # use a white theme for better contrast

plot

...