代码之家  ›  专栏  ›  技术社区  ›  maycca

R ggpubr:按组添加平均水平线和对比较?

  •  4
  • maycca  · 技术社区  · 7 年前

    我最近发现 ggpubr 包裹当我与多个组一起工作时,我喜欢将数据拆分为多个方面( facet.by )。

    我的问题由两个子问题组成,与同一个图表相关。我想

    1. 添加每组的唯一平均水平线
    2. 按组仅绘制显著性比较

    我的目标是显示箱线图及其配对比较显著性值。由于各组的显著性可能不同,因此我只能绘制显著组,或者指定显著比较,然后分别绘制每组。

    示例数据:

    library(ggpubr)
    library(ggplot2)  
    
    # Create data
    # :::::::::::::::::::::::::::::::::::::::::::::::::::
    data("ToothGrowth")
    df <- ToothGrowth
    
    # Create basic plot
    p <- ggboxplot(df, 
                   x = "dose", 
                   y = "len",
                   color = "dose", 
                   palette =c("#00AFBB", "#E7B800", "#FC4E07"),
                   add = "jitter",
                   facet.by = "supp", # define faceting 
                   shape = "dose")
    
    # Add horizontal line per each group???
    p + geom_hline(yintercept = mean(df$len), #aggregate(len ~ supp, df, mean)$len, # mean(df$len), 
                   linetype = 2,
                   group = "supp")
    

    导致

    enter image description here

    我试着计算每组的平均数( #aggregate(len ~ supp, df, mean)$len ),但它只添加了两行。


    要指定成对箱线图以显示显著性结果,我可以添加

    my_comparisons <- list( c("0.5", "1"), c("1", "2"), c("0.5", "2") )
    

    显著性结果取决于组。然而,我只想展示一些重要的比较。如何在每组中仅指定有效对?类似于:

    my_comp_OJ <- list( c("0.5", "1"), c("0.5", "2"))
    my_comp_VC <- list(  c("0.5", "1"), c("1", "2"), c("0.5", "2"))
    

    正在应用 hide.ns = TRUE 仅隐藏 ns ,但保留对的行指示。

    p +  stat_compare_means(comparisons = my_comparisons,
                            label = "p.signif",
                            hide.ns = TRUE) +   # Add pairwise comparisons p-value 
        stat_compare_means(label.y = 50)        # Add global p-value
    

    enter image description here

    1 回复  |  直到 7 年前
        1
  •  5
  •   Roman LuÅ¡trik    7 年前

    你必须计算每组的总平均值,并有一个数据。框架,表示平均值来自哪个组。

    > aggregate(len ~ supp, data = df, FUN = mean)
      supp      len
    1   OJ 20.66333
    2   VC 16.96333
    

    将此包含在 geom_hline

    grand.means <- aggregate(len ~ supp, data = df, FUN = mean)
    ggboxplot(df, 
              x = "dose", 
              y = "len",
              color = "dose", 
              palette = c("#00AFBB", "#E7B800", "#FC4E07"),
              add = "jitter",
              facet.by = "supp", # define faceting 
              shape = "dose") +
      geom_hline(data = grand.means, aes(yintercept = len),
                 linetype = 2,
                 group = "supp")
    

    请注意 data 争论与我的男人 len yintercept 在内部 aes 呼叫这使得 ggplot 意识到它正确适用 aes公司 变量到相应的组,无论您如何应用它们。

    enter image description here

    至于调整后的重要性条,我认为没有现成的答案,因为 ggpubr 呼叫 ggsignif 有一个 manual 参数,但前者并没有实现它,至少在我浏览源代码时可以看到。我认为这条线很好,因为它表明我们进行了比较,即使这并不重要。