【问题标题】:Plotting ordiellipse function from vegan package onto NMDS plot created in ggplot2将 vegan 包中的 ordiellipse 函数绘制到在 ggplot2 中创建的 NMDS 图上
【发布时间】:2012-11-27 11:32:25
【问题描述】:

我使用ggplot2 来创建 NMDS 图,而不是普通的绘图函数。我想使用 vegan 包中的函数 ordiellipse() 在 NMDS 图中显示组。

示例数据:

library(vegan)
library(ggplot2)
data(dune)
# calculate distance for NMDS
sol <- metaMDS(dune)
# 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)
# draw dispersion ellipses around data points
ordiellipse(sol, MyMeta$amt, display = "sites", kind = "sd", label = T)

# 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))

如何将 ordiellipse 添加到使用 ggplot2 创建的 NMDS 图中?

Didzis Elferts 下面的回答效果很好。谢谢!但是,我现在有兴趣在使用 ggplot2 创建的 NMDS 图上绘制以下 Ordielipse:

ordiellipse(sol, MyMeta$amt, display = "sites", kind = "se", conf = 0.95, label = T)

不幸的是,我对veganCovEllipse 函数的工作原理还不够了解,无法自己调整脚本。

【问题讨论】:

    标签: r ggplot2 vegan


    【解决方案1】:

    首先,我将列组添加到您的 NMDS 数据框中。

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

    第二个数据框包含每个组的平均 MDS1 和 MDS2 值,它将用于在图上显示组名

      NMDS.mean=aggregate(NMDS[,1:2],list(group=group),mean)
    

    数据框df_ell 包含显示椭圆的值。它是用隐藏在vegan 包中的函数veganCovEllipse 计算的。该函数应用于NMDS(组)的每个级别,它还使用函数cov.wt来计算协方差矩阵。

      veganCovEllipse<-function (cov, center = c(0, 0), scale = 1, npoints = 100) 
      {
        theta <- (0:npoints) * 2 * pi/npoints
        Circle <- cbind(cos(theta), sin(theta))
        t(center + scale * t(Circle %*% chol(cov)))
      }
    
      df_ell <- data.frame()
      for(g in levels(NMDS$group)){
        df_ell <- rbind(df_ell, cbind(as.data.frame(with(NMDS[NMDS$group==g,],
                        veganCovEllipse(cov.wt(cbind(MDS1,MDS2),wt=rep(1/length(MDS1),length(MDS1)))$cov,center=c(mean(MDS1),mean(MDS2)))))
                        ,group=g))
      }
    

    现在用函数geom_path()annotate() 绘制椭圆,用于绘制组名。

      ggplot(data = NMDS, aes(MDS1, MDS2)) + geom_point(aes(color = group)) +
        geom_path(data=df_ell, aes(x=MDS1, y=MDS2,colour=group), size=1, linetype=2)+
        annotate("text",x=NMDS.mean$MDS1,y=NMDS.mean$MDS2,label=NMDS.mean$group)
    

    椭圆绘图的想法来自另一个stackoverflow question

    更新 - 适用于两种情况的解决方案

    首先,制作带有组列的 NMDS 数据框。

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

    接下来,将函数ordiellipse()的结果保存为某个对象。

    ord<-ordiellipse(sol, MyMeta$amt, display = "sites", 
                       kind = "se", conf = 0.95, label = T)
    

    数据框df_ell 包含显示椭圆的值。它使用隐藏在vegan 包中的函数veganCovEllipse 再次计算。此函数应用于 NMDS(组)的每个级别,现在它使用存储在 ord 对象中的参数 - 每个级别的 covcenterscale

    df_ell <- data.frame()
    for(g in levels(NMDS$group)){
      df_ell <- rbind(df_ell, cbind(as.data.frame(with(NMDS[NMDS$group==g,],
                      veganCovEllipse(ord[[g]]$cov,ord[[g]]$center,ord[[g]]$scale)))
                                    ,group=g))
    }
    

    绘图的方式与前面的示例相同。至于使用ordiellipse() 的椭圆对象的坐标计算,此解决方案将适用于您为此函数提供的不同参数。

    ggplot(data = NMDS, aes(MDS1, MDS2)) + geom_point(aes(color = group)) +
      geom_path(data=df_ell, aes(x=NMDS1, y=NMDS2,colour=group), size=1, linetype=2)
    

    【讨论】:

    • 嗨!一个后续问题:如果我想绘制以下 ordiellipse 函数,我将如何更改脚本: ordiellipse(sol, MyMeta$amt, display = "sites", kind = "se", conf = 0.95, label = T) 谢谢!
    • @Dalmuti71 用更通用的解决方案更新了我的答案
    【解决方案2】:

    两个更新:

    1。 NMDS.mean=aggregate(NMDS[,1:2],list(group=group),mean)

    应该更新为

    NMDS.mean=aggregate(NMDS[,1:2],list(group=NMDS$group),"mean")
    

    NMDS$group 不是一个因素,因此循环 NMDS$group 的级别不起作用。 Df_ell 在零个变量中返回零个观测值。

     NMDS$group <- as.factor(NMDS$group)
    

    解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 2015-12-09
      • 2020-11-14
      • 2014-01-07
      • 1970-01-01
      相关资源
      最近更新 更多