我想使用ggplot2为我正在处理的一些数据制作一个NMDS排序图。有一个很好的例子,说明如何从先前的堆栈溢出线程执行此操作:Plotting ordiellipse function from vegan package onto NMDS plot created in ggplot2
我试图从此前一个帖子中复制此功能并用于我的数据。但是,在将函数传递给R。后,我遇到以下错误消息:
数组中的错误(x,c(length(x),1L),if(!is.null(names(x)))list(names(x),): 'data'必须是矢量类型,'NULL'
我可以让这个功能适用于素食套餐提供的沙丘数据集,但是我已经使用我自己的数据集遇到了障碍。任何人有任何想法或想法?我在下面的数据集中提供了一个链接,并在下面粘贴了我的代码。
可以看到数据: https://docs.google.com/spreadsheets/d/1O2YCapLaCMlCco3-0mZ07_KoJPTfWdjWYudLvMd183Y/edit?usp=sharing
代码:
# rm(list=ls(all=T))
setwd('C:')
library(vegan)
library(ggplot2)
PCBprop<-read.csv("PCBprop_stackoverflow.csv", header=T)
#Subset to just Lake Michigan Observation
MICH<-PCBprop[with(PCBprop, BASIN=="MICHIGAN"),]
#MICHIGAN
michcovariate<-MICH[,c(1,2)]#covariate data
michcongener<- MICH[,3:60]# PCB congener data
michpcbnmds <- metaMDS(michcongener, k = 2, distance ='bray', autotransform = TRUE, trymax=500)
score<-scores(michpcbnmds)
nmdsscores<-data.frame(cbind(michcovariate,score))
plot(michpcbnmds$points, col = nmdsscores$CAT2) #Basic ordination plot from Vegan
ord<-ordiellipse(michpcbnmds, nmdsscores$CAT2, display = "sites", kind = "se", conf = 0.95, label = T) #95% ellipses on plot
#Ordiellipse Graph
NMDS = data.frame(NMDS1 = nmdsscores$NMDS1, NMDS2=nmdsscores$NMDS2, group=nmdsscores$CAT2)#sets up data frame
df_ell <- data.frame()
for(g in levels(NMDS$group)){
df_ell <- rbind(df_ell, cbind(as.data.frame(with(NMDS[NMDS$group==g,],
vegan:::veganCovEllipse(ord[[g]]$cov,ord[[g]]$center,ord[[g]]$scale))) ,group=g))}
g1<-ggplot(data = NMDS, aes(NMDS1, NMDS2)) + geom_point(aes(color = group), size=1.5) +
geom_path(data=df_ell, aes(x=NMDS1, y=NMDS2,colour=group), size=1.5, linetype=2) +
scale_colour_brewer(palette="Dark2", name="Species_Location")
答案 0 :(得分:1)
喜欢这个吗?
问题是其中一个组ord[[g]] = NULL
)BND_NO
。这可能是因为BASIN==MICHIGAN
时该组只有2行数据,这不足以生成95%置信度椭圆。
我在循环开头添加了以下行:
if(is.null(ord[[g]])) next
生成上图。