在GGPLOT2绘制envfit载体(纯素包)(Plotting envfit vectors (v

2019-07-19 07:12发布

我的工作敲定,我素食和GGPLOT2创建,但无法弄清楚如何envfit种载荷向量添加到情节NMDS情节。 当我尝试它说:“无效的图形状态”。

下面的例子稍微从另一个问题修改( 绘制ordiellipse从素食主义者包装功能上的GGPLOT2创建NMDS情节 ),但它表达的正是我想包括,因为我用这个问题来帮我拿metaMDS到摆在首位GGPLOT2的例子:

library(vegan)
library(ggplot2)
data(dune)

# calculate distance for NMDS
NMDS.log<-log(dune+1)
sol <- metaMDS(NMDS.log)

# Create meta data for grouping
MyMeta = data.frame(
  sites = c(2,13,4,16,6,1,8,5,17,15,10,11,9,18,3,20,14,19,12,7),
  amt = c("hi", "hi", "hi", "md", "lo", "hi", "hi", "lo", "md", "md", "lo", 
      "lo", "hi", "lo", "hi", "md", "md", "lo", "hi", "lo"),
row.names = "sites")

# plot NMDS using basic plot function and color points by "amt" from MyMeta
plot(sol$points, col = MyMeta$amt)

# same in ggplot2
NMDS = data.frame(MDS1 = sol$points[,1], MDS2 = sol$points[,2])
ggplot(data = NMDS, aes(MDS1, MDS2)) + 
  geom_point(aes(data = MyMeta, color = MyMeta$amt))

#Add species loadings
vec.sp<-envfit(sol$points, NMDS.log, perm=1000)
plot(vec.sp, p.max=0.1, col="blue")

Answer 1:

开始添加库。 另外库grid是必要的。

library(ggplot2)
library(vegan)
library(grid)
data(dune)

做metaMDS分析,并保存在数据帧的效果。

NMDS.log<-log(dune+1)
sol <- metaMDS(NMDS.log)

NMDS = data.frame(MDS1 = sol$points[,1], MDS2 = sol$points[,2])

添加物质负荷,并保存为数据帧。 箭头余弦方向被存储在列表中vectors和矩阵arrows 。 为了得到这些箭头方向的值应通过的平方根相乘的坐标r2值被存储在vectors$r 。 更直接的方法是使用功能scores()在@Gavin辛普森的回答中提供。 然后加入新的包含列species名称。

vec.sp<-envfit(sol$points, NMDS.log, perm=1000)
vec.sp.df<-as.data.frame(vec.sp$vectors$arrows*sqrt(vec.sp$vectors$r))
vec.sp.df$species<-rownames(vec.sp.df)

箭头与加geom_segment()并与物种名称geom_text() 对于这两个任务的数据帧vec.sp.df被使用。

ggplot(data = NMDS, aes(MDS1, MDS2)) + 
  geom_point(aes(data = MyMeta, color = MyMeta$amt))+
  geom_segment(data=vec.sp.df,aes(x=0,xend=MDS1,y=0,yend=MDS2),
      arrow = arrow(length = unit(0.5, "cm")),colour="grey",inherit_aes=FALSE) + 
  geom_text(data=vec.sp.df,aes(x=MDS1,y=MDS2,label=species),size=5)+
  coord_fixed()



Answer 2:

与(否则优秀)接受的答案,其问题,并且解释了为什么矢量都在附带的图中的相同长度的[ 注意接受的答案现已编辑按比例绘制在I中描述的方式的箭头所示,以避免为用户提供跨Q&A]来混乱 ,是什么被存储在$vectors$arrows由返回的对象的分量envfit()是拟合矢量的方向余弦。 这些都是单位长度的,并因此在@Didzis Elferts'曲线的箭头都具有相同的长度。 这是为了从输出不同plot(envfit(sol, NMDS.log))并产生是因为我们缩放矢量箭头通过与协调配置(“轴”)的相关性的坐标。 这样一来,物种展现与协调配置的弱关系变短箭头。 缩放被由方向余弦相乘完成sqrt(r2)其中r2是在打印输出的表中所示的值。 当添加载体到现有的情节, 纯素也尝试缩放集合,使得它们填充可用的情节空间,同时保持箭头的相对长度向量。 如何做到这一点的详细信息部分进行了讨论?envfit并要求使用未导出的函数的vegan:::ordiArrowMul(result_of_envfit)

这是一种可复制的行为完全工作示例plot.envfit使用GGPLOT2:

library(vegan)
library(ggplot2)
library(grid)
data(dune)

# calculate distance for NMDS
NMDS.log<-log1p(dune)
set.seed(42)
sol <- metaMDS(NMDS.log)

scrs <- as.data.frame(scores(sol, display = "sites"))
scrs <- cbind(scrs, Group = c("hi","hi","hi","md","lo","hi","hi","lo","md","md",
                              "lo","lo","hi","lo","hi","md","md","lo","hi","lo"))

set.seed(123)
vf <- envfit(sol, NMDS.log, perm = 999)

如果我们停止在这一点上,并期待在vf

> vf

***VECTORS

             NMDS1       NMDS2     r2 Pr(>r)    
Belper -0.78061195 -0.62501598 0.1942  0.174    
Empnig -0.01315693  0.99991344 0.2501  0.054 .  
Junbuf  0.22941001 -0.97332987 0.1397  0.293    
Junart  0.99999981 -0.00062172 0.3647  0.022 *  
Airpra -0.20995196  0.97771170 0.5376  0.002 ** 
Elepal  0.98959723  0.14386566 0.6634  0.001 ***
Rumace -0.87985767 -0.47523728 0.0948  0.429
.... <truncated>

所以r2数据用于缩放在列中的值NMDS1NMDS2 。 最后的情节产生具有:

spp.scrs <- as.data.frame(scores(vf, display = "vectors"))
spp.scrs <- cbind(spp.scrs, Species = rownames(spp.scrs))

p <- ggplot(scrs) +
  geom_point(mapping = aes(x = NMDS1, y = NMDS2, colour = Group)) +
  coord_fixed() + ## need aspect ratio of 1!
  geom_segment(data = spp.scrs,
               aes(x = 0, xend = NMDS1, y = 0, yend = NMDS2),
               arrow = arrow(length = unit(0.25, "cm")), colour = "grey") +
  geom_text(data = spp.scrs, aes(x = NMDS1, y = NMDS2, label = Species),
            size = 3)

这将产生:



Answer 3:

我想补充的东西迟到了?

Envfit提供p值,有时你只想绘制显著参数(素食主义者的东西能为你做第=在绘图命令0.05)。 我努力做到这一点与GGPLOT2。 这里是我的解决方案,也许你会发现一个更优雅呢?

从Didzis的回答起价上面:

ef<-envfit(sol$points, NMDS.log, perm=1000)
ef.df<-as.data.frame(ef$vectors$arrows*sqrt(ef$vectors$r))
ef.df$species<-rownames(ef.df)

#only significant pvalues
#shortcutting ef$vectors
A <- as.list(ef$vectors)
#creating the dataframe
pvals<-as.data.frame(A$pvals)
arrows<-as.data.frame(A$arrows*sqrt(A$r))
C<-cbind(arrows, pvals)
#subset
Cred<-subset(C,pvals<0.05)
Cred <- cbind(Cred, Species = rownames(Cred))

“中房”现在可以在geom_segment参数的如上所讨论的实现。



文章来源: Plotting envfit vectors (vegan package) in ggplot2
标签: r ggplot2 vegan