You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:39:03