R语言vegan包ordiplot绘制排序图报X对象未找到错误求解
报错核心原因
vegan包ordiplot()函数的首参数要求传入提前计算完成的排序分析结果对象(如rda()、cca()、metaMDS()等降维函数的输出),不支持直接传入双变量回归公式。你直接将Mean_pH ~ Mean_Water_Table_Depth作为入参传入时,函数内部找不到对应排序结果矩阵,就会触发Error in NROW(X) : object 'X' not found报错。
另外不建议使用attach()挂载数据集,很容易引发变量名冲突,后续排查问题成本极高,直接通过数据框名$列名的格式索引变量更稳妥。
你的数据结构参考如下:
带物种标签、图例的排序图实现代码
以下代码可直接实现你需要的效果:以Mean_Water_Table_Depth为X轴、Mean_pH为Y轴,每个点标注spec.X格式的物种缩写标签,配套物种分类图例。
# 加载vegan包 library(vegan) # 读取数据,注意制表符分隔的txt文件必须加sep="\t",否则容易出现列识别错误 Ordination <- read.table("pHWTD.txt", header = TRUE, sep = "\t", stringsAsFactors = TRUE) # 提前校验变量格式,若返回结果不是"numeric",用as.numeric()转换对应列即可 class(Ordination$Mean_pH) class(Ordination$Mean_Water_Table_Depth) # 初始化空白排序图框架 ordiplot( NULL, xlim = range(Ordination$Mean_Water_Table_Depth), ylim = range(Ordination$Mean_pH), xlab = "Mean Water Table Depth", ylab = "Mean pH", type = "n" ) # 按物种分类绘制散点 species_col <- rainbow(length(unique(Ordination$Species))) points( x = Ordination$Mean_Water_Table_Depth, y = Ordination$Mean_pH, pch = 16, col = species_col[as.numeric(Ordination$Species)] ) # 添加spec.1格式的物种标签,自动调整位置避免重叠 orditorp( x = Ordination[, c("Mean_Water_Table_Depth", "Mean_pH")], labels = paste0("spec.", 1:nrow(Ordination)), cex = 0.8, col = species_col[as.numeric(Ordination$Species)] ) # 添加物种分类图例 legend( "topright", legend = unique(Ordination$Species), pch = 16, col = species_col, bty = "n" )
扩展场景(正规群落降维排序)
如果你需要做的是基于群落物种多度数据的降维排序(如PCA、RDA、CA、NMDS),只需先调用对应排序函数计算结果,再将结果对象传入ordiplot()即可,参考代码如下:
# 示例:以pH、地下水位为环境因子做RDA排序 # 提取物种多度矩阵(剔除物种分类列、环境因子列) comm_matrix <- Ordination[, !colnames(Ordination) %in% c("Species", "Mean_pH", "Mean_Water_Table_Depth")] # 计算RDA结果 rda_res <- rda(comm_matrix ~ Mean_pH + Mean_Water_Table_Depth, data = Ordination, scale = TRUE) # 绘制排序图 ordiplot(rda_res, type = "n") # 添加物种点与标签 points(rda_res, display = "species", pch = 16, col = "steelblue") orditorp(rda_res, display = "species", labels = paste0("spec.", 1:ncol(comm_matrix)), col = "steelblue", cex = 0.7) # 添加样方点 points(rda_res, display = "sites", pch = 1) # 添加环境因子箭头 plot(envfit(rda_res ~ Mean_pH + Mean_Water_Table_Depth, data = Ordination, perm = 999), col = "red")
调参提示
- 标签重叠时可调整
orditorp()的cex参数缩小字号,或换用ordilabel()给标签添加白底色提升可读性。 - 散点、标签的颜色可自行替换为需要的色值,无需使用默认彩虹配色。
内容的提问来源于stack exchange,提问作者Glacial Phoenix
相关产品推荐
相关产品推荐

