如何使用ggplot2绘制vegan包metaMDS结果对应的stressplot(Shepard图)
使用ggplot2绘制vegan metaMDS分析的Shepard图
完全可以实现。vegan内置stressplot()的核心元素可直接从metaMDS结果对象中提取,无需额外依赖包即可复刻甚至自定义绘图效果。
实现步骤与完整代码
1. 前置依赖与示例数据构建
和示例逻辑一致,先加载包并完成NMDS分析:
library(vegan) library(ggplot2) 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="")) ) # 运行NMDS分析 example_NMDS = metaMDS(community_matrix, k=2)
2. 提取绘图所需数据
Shepard图核心包含三类数据:原始群落相异度、NMDS排序空间距离、保序回归(单调回归)拟合结果:
# 整理观测距离与排序距离的对应数据框 df_shepard <- data.frame( obs_dist = as.vector(example_NMDS$diss), # 原始观测相异度 ord_dist = as.vector(example_NMDS$dist) # NMDS排序空间距离 ) # 计算保序回归拟合结果(对应原生stressplot的阶梯线) fit_isoreg <- isoreg(df_shepard$obs_dist, df_shepard$ord_dist) df_fit <- data.frame( obs_dist = fit_isoreg$x, fit_dist = fit_isoreg$yf ) # 提取应力值用于标注 stress_val <- round(example_NMDS$stress, 4)
3. ggplot2绘图
绘图逻辑完全对齐原生stressplot()的样式,也可根据需求自定义配色、字号等:
ggplot() + # 绘制观测散点 geom_point(data = df_shepard, aes(x = obs_dist, y = ord_dist), size = 1.2, alpha = 0.7) + # 绘制保序回归阶梯拟合线 geom_step(data = df_fit, aes(x = obs_dist, y = fit_dist), color = "red", linewidth = 0.8) + # 标注应力值 annotate("text", x = Inf, y = Inf, label = paste0("Stress = ", stress_val), hjust = 1.1, vjust = 1.5, size = 4) + # 坐标轴与主题设置 labs(x = "Observed Dissimilarity", y = "Ordination Distance") + theme_bw(base_size = 12) + theme(panel.grid = element_blank())
效果说明
上述代码输出的图和原生stressplot(example_NMDS)结果完全一致:散点对应两两样本的距离匹配关系,红色阶梯线为单调拟合结果,右上角标注了模型的应力值。如果需要调整样式(比如修改散点颜色、添加拟合方程标注、调整坐标轴范围),直接修改ggplot的对应参数即可。
内容的提问来源于stack exchange,提问作者Freddie J. Heather
相关产品推荐
相关产品推荐

