vegan3d包ordiplot3d绘制3D NMDS的三类常见问题求助
问题解决方法
对应问题的解决方案
- 解决绘图布局大幅偏移的问题
你当前代码重复运行了两次metaMDS函数,NMDS排序本身包含随机过程,两次运行得到的坐标结果本身就存在差异,再加上没有设定随机种子,每次运行结果都会波动。统一只运行一次metaMDS,同时在运行前加set.seed()指定随机种子,就能固定排序结果和绘图布局。 - 解决点位置超出绘图区域的问题
ordiplot3d默认只根据站点坐标计算绘图范围,物种得分的范围通常更大,手动指定xlim/ylim/zlim参数,将物种和站点的所有坐标极值都纳入范围,再额外留10%-20%的冗余量,就可以避免点超出边界。 - 解决物种名称重叠的问题
你当前只对站点标签用了带文本避让功能的orditorp,物种标签直接用了无避让的text,调整为对物种标签也用orditorp,同时可以适当缩小物种标签的cex参数,或者筛选仅显示丰度前N位的物种,就能大幅缓解重叠问题。
修改后可直接运行的完整代码
library(vegan) library(vegan3d) library(tidyverse) data("dune") SiteID <- 1:20 # 设定随机种子固定排序结果,仅运行一次metaMDS set.seed(123) NMDS_input <- metaMDS(dune, distance="bray", try=500, wascores = TRUE, k=3) # 提取坐标 NMDS <- as.data.frame(scores(NMDS_input, display = "sites")) %>% mutate(SiteID = SiteID) sp <- scores(NMDS_input, choices=1:3, display="species", scaling="symmetric") si <- scores(NMDS_input, choices=1:3, display="sites", scaling="symmetric") # 计算全局坐标范围,留15%冗余避免内容溢出 all_coords <- rbind(sp, si) x_range <- range(all_coords[,1]) * 1.15 y_range <- range(all_coords[,2]) * 1.15 z_range <- range(all_coords[,3]) * 1.15 # 绘图时手动指定坐标范围 pl4 <- ordiplot3d(NMDS_input, pch=16, angle=50, main="Fish ion level 3", cex.lab=1.7, cex.symbols=1.5, tick.marks=FALSE, xlim = x_range, ylim = y_range, zlim = z_range) # 物种标签改用orditorp实现自动避让,可按需调整air和cex参数 orditorp(pl4, display = "species", labels = rownames(sp), air = 1.2, cex = 0.6, xpd = TRUE) # 站点标签保留避让设置 orditorp(pl4, labels = NMDS$SiteID, air=1, cex = 1)
内容的提问来源于stack exchange,提问作者ecology
相关产品推荐
相关产品推荐

