ggplot2 版本的 shepard plot,即 vegan::stressplot()?

ggplot2 version of shepard plot, i.e. vegan::stressplot()?

似乎有很多关于使用 ggplot2 绘制 NMDS 输出(即 NMDS1 与 NMDS1)的信息,但是我找不到使用 vegan::stressplot()(谢泼德图)的方法 ggplot2.

有没有办法生成 metaMDS 输出的 ggplot2 版本?

可重现代码

library(vegan)

set.seed(2)

community_matrix = matrix(
  sample(1:100,300,replace=T),nrow=10,
  dimnames=list(paste("community",1:10,sep=""),paste("sp",1:30,sep="")))

example_NMDS=metaMDS(community_matrix, k=2) 

stressplot(example_NMDS)

reprex package (v2.0.1)

于 2021-09-17 创建

这里有一个变通方法,可以使用 ggplot2 绘制非常相似的图。诀窍是获取 stressplot(example_NMDS) 的结构并提取存储在该对象中的数据。我使用了包含 ggplottidyverse 包和包含 pivot_longer 函数的其他包,例如 tidyr

library(vegan)
library(tidyverse)

# Analyze the structure of the stressplot
# Notice there's an x, y and yf list
str(stressplot(example_NMDS))

# Create a tibble that contains the data from stressplot
df <- tibble(x = stressplot(example_NMDS)$x,
       y = stressplot(example_NMDS)$y,
       yf = stressplot(example_NMDS)$yf) %>%
  # Change data to long format
  pivot_longer(cols = c(y, yf),
               names_to = "var")

# Create plot
df %>%
  ggplot(aes(x = x,
             y = value)) +
  # Add points just for y values
  geom_point(data = df %>%
               filter(var == "y")) +
  # Add line just for yf values
  geom_step(data = df %>%
              filter(var == "yf"),
            col = "red",
            direction = "vh") +
  # Change axis labels
  labs(x = "Observed Dissimilarity", y = "Ordination Distance") +
  # Add bw theme
  theme_bw()