将自定义注释添加到 p 值标签到 ggpubr stat_compare_means()

Posted

技术标签:

【中文标题】将自定义注释添加到 p 值标签到 ggpubr stat_compare_means()【英文标题】:Add custom annotation to p-value label to ggpubr stat_compare_means() 【发布时间】:2022-01-12 12:37:05 【问题描述】:

我尝试用显示 p 值制作箱线图

my_comparisons <- list( c("0.5", "1"), c("1", "2"), c("0.5", "2") )
ggboxplot(ToothGrowth, x = "dose", y = "len")+ 
  stat_compare_means(comparisons = my_comparisons, method = "wilcox.test")

结果是

但是如何在计算的 p 值中添加额外的文本?我要加 "p = " 如下图

我该怎么做?

更新。以下变体不起作用

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

ggboxplot(ToothGrowth, x = "dose", y = "len")+ 
  stat_compare_means(comparisons = my_comparisons, method = "wilcox.test", aes(label=paste("p=",scientific(as.numeric(..p.format..)))))

ggboxplot(ToothGrowth, x = "dose", y = "len")+ 
  stat_compare_means(comparisons = my_comparisons, method = "wilcox.test", aes(label = paste("p =", ..p.format..)))

ggboxplot(ToothGrowth, x = "dose", y = "len")+ 
  stat_compare_means(comparisons = my_comparisons, method = "wilcox.test", aes(label = paste0("p =", ..p.format..)))

【问题讨论】:

根据文档使用label = "p.format",一些不错的例子可以在这里找到:sthda.com/english/articles/24-ggpubr-publication-ready-plots/… @MerijnvanTilborg 我不知道为什么,但它不起作用。我更新了我的问题。 sthda.com/english/articles/24-ggpubr-publication-ready-plots/… 【参考方案1】:

他们还提供了一种解决方法,我对其进行了一些更改以创建您自己的自定义formatted.p。请注意,您还需要包 rstatix。

library(ggpubr)
library(ggplot2)
library(rstatix)

data("ToothGrowth") # data is part of the package ggpubr

my_comparisons = list(c("0.5", "1"), c("1", "2"), c("0.5", "2"))

stat.test <- ToothGrowth %>% 
  wilcox_test(len ~ dose, comparisons = my_comparisons) %>%
  add_xy_position(x = "dose") %>%
  mutate(myformatted.p = paste0("p = ", p))

stat.test

# # A tibble: 3 x 14
#   .y.   group1 group2    n1    n2 statistic            p       p.adj p.adj.signif y.position groups     xmin  xmax myformatted.p   
#   <chr> <chr>  <chr>  <int> <int>     <dbl>        <dbl>       <dbl> <chr>             <dbl> <list>    <dbl> <dbl> <chr>           
# 1 len   0.5    1         20    20      33.5 0.00000702   0.000014    ****               35.4 <chr [2]>     1     2 p = 0.00000702  
# 2 len   1      2         20    20      61   0.000177     0.000177    ***                37.6 <chr [2]>     2     3 p = 0.000177    
# 3 len   0.5    2         20    20       1.5 0.0000000841 0.000000252 ****               39.9 <chr [2]>     1     3 p = 0.0000000841


ggboxplot(ToothGrowth, x = "dose", y = "len", color = "dose") + 
  stat_pvalue_manual(stat.test, label = "myformatted.p")

要更好地控制格式和舍入,您可以使用它或更改为您希望的任何格式。

mutate(myformatted.p = paste0("p = ", ifelse(p < 1e-5, format(p, scientific = T), signif(p, digits = 2))))

【讨论】:

【参考方案2】:

我相信这可能是 ggpubr 中的一个错误。该文档提供了一个如何将自定义文本添加到您的 p 值的示例。当将几个比较传递给标签函数时,这开始失败。我认为错误可能是 ggplot 不知道将哪个表达式解析为标签(请参阅下面的 r-lang 警告)。还有一些关于 p 值计算的警告可能是相关的。

也就是说,我认为关于 ggpubr 的大多数问题都与具有多个 p 值的注释有关,我确实认为您可能需要重新考虑 (a) 您的统计数据和 (b) 您的可视化。

library(ggpubr)
#> Loading required package: ggplot2
library(tidyverse)

## This works as expected. Only one test
ggboxplot(ToothGrowth, x = "supp", y = "len") + 
  stat_compare_means(aes(label = paste0("p = ", ..p.format..)))

查看大量警告 - 开始失败。

my_comparisons <- list( c("0.5", "1"), c("1", "2"), c("0.5", "2") )
ggboxplot(ToothGrowth, x = "dose", y = "len") +
  stat_compare_means(comparisons = my_comparisons, 
                     aes(label = paste0("p = ", ..p.format..)))
#> Warning: Using `as.character()` on a quosure is deprecated as of rlang 0.3.0.
#> Please use `as_label()` or `as_name()` instead.
#> This warning is displayed once per session.
#> Warning in wilcox.test.default(c(4.2, 11.5, 7.3, 5.8, 6.4, 10, 11.2, 11.2, :
#> cannot compute exact p-value with ties
#> Warning in wilcox.test.default(c(4.2, 11.5, 7.3, 5.8, 6.4, 10, 11.2, 11.2, :
#> cannot compute exact p-value with ties
#> Warning in wilcox.test.default(c(16.5, 16.5, 15.2, 17.3, 22.5, 17.3, 13.6, :
#> cannot compute exact p-value with ties

通过分别为每个比较组创建一个图,这又开始起作用了。

ls_tg <- ToothGrowth %>%
  split(., .$dose)

lapply(my_comparisons, function(x) bind_rows(ls_tg[x])) %>%
  map(~ggboxplot(., x = "dose", y = "len") + 
        stat_compare_means(aes(label = paste0("p = ", ..p.format..)))) %>%
  patchwork::wrap_plots()

由reprex package 创建于 2021-12-07 (v2.0.1)

【讨论】:

是的,这是一个错误(( - github.com/kassambara/ggpubr/issues/327

以上是关于将自定义注释添加到 p 值标签到 ggpubr stat_compare_means()的主要内容,如果未能解决你的问题,请参考以下文章

将自定义文本添加到 iPhone sdk 中的 uibutton

R语言使用ggpubr包的ggviolin函数可视化分组小提琴图(自定义调色板添加分组对比的p值添加内嵌箱图自定义内嵌箱图色彩)

R语言使用ggpubr包的ggviolin函数可视化分组小提琴图(自定义调色板添加分组对比的p值添加内嵌箱图自定义内嵌箱图色彩)

R语言使用ggpubr包的ggarrange函数组合多张结论图(垂直堆叠组合)并为组合后的图像添加图形的注释信息(标题,副标题,坐标轴,字体,颜色等)

如何将自定义片段添加到 zen-coding?

Django 将自定义表单错误添加到 form.errors