一行代码添加P值的可视化技巧分享~~

点击上方“DataCharm”,选择“星标”公众号

84100daac39ab175b2a64b8ce5eecdf4.png

在一些常见的统计图表中经常需要在一些图表中添加P值,那么今天小编给大家汇总一下关于统计图表中P值的添加方法。今天推文的主要内容如下:

  • P值简单介绍

  • 可视化绘制中P值绘制

P值简单介绍

P值是指在一个概率模型中,统计摘要(如两组样本均值差)与实际观测数据相同,或甚至更大这一事件发生的概率。换言之,是检验假设零假设成立或表现更严重的可能性。P值若与选定显著性水平(0.05或0.01) 相比更小,则零假设会被否定而不可接受。然而这并不直接表明原假设正确。P值是一个服从正态分布的随机变量,在实际使用中因样本等各种因素存在不确定性.在许多研究领域,0.05的P值通常被认为是可接受错误的边界水平。(内容来源于网络,本来小编想自己写来着,可是,小编机会忘完啦e8bd219fb02dddefb70be204906d1bf7.png0b440b1718e8a16b4ebb8d10546c5e24.png,详细的内容,小伙伴们可自行搜索哈~~)

可视化绘制中P值绘制

作为本期推文的重点介绍,如何在我们的可视化图表中添加P值,使其更好的表现图表含义是在绘制图表是需要考虑的。本次,小编就使用R-ggpubr和R-ggsignif包进行P值添加及定制化操作。直接上干货~~

R-ggpubr 添加P值

在使用ggpubr包进行P值添加之前,我们需导入R-rstatix包进行必要的统计操作(T检验等),这里我们直接通过例子进行解释说明。

「简单例子」

# 导入必要的包
library(tidyverse)
library(ggtext)
library(hrbrthemes)
library(ggpubr)
library(rstatix)
library(ggsci)

# 导入数据
df <- ToothGrowth
df$dose <- as.factor(df$dose)

# 进行T-test
stat.test <- df %>% rstatix::t_test(len ~ supp) %>% rstatix::add_significance()

# 进行可视化绘制
stat.test <- stat.test %>% rstatix::add_xy_position(x = "supp")
bxp <- ggpubr::ggboxplot(df, x = "supp", y = "len", fill = "supp",
                         palette="jco",
                         ggtheme= hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")) +

  labs(
    title = "Example of <span style='color:#D20F26'> add P values in ggpubr</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>ggpubr::ggboxplot + rstatix::t_test</span>",
    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>")+
  # 添加P值
  stat_pvalue_manual(stat.test, label = "p") +
  scale_y_continuous(expand = expansion(mult = c(0.05, 0.1)))+
  theme(
    plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                  size = 20, margin = margin(t = 1, b = 12)),
    plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
    plot.caption = element_markdown(face = 'bold',size = 12))
d302a5b5a9f86f29ef6ccd48790d15b3.png
boxplot with P value

此外,你还可以通过显示P值的显著性水平(p.signif)

+
stat_pvalue_manual(stat.test, label = "p.signif")
+
b4d890424548918b2665f3df40bbe9a7.png
boxplot with P value in different form

「分组数据例子」:如果我们面对分组数据时,我么可通过如下代码进行组与组数据直接的显著性比较,我们还是使用上面的数据,只不过使用group_by进行分组操作:

# 分组计算P值
stat.test <- df %>% group_by(dose) %>%rstatix::t_test(len ~ supp) %>% rstatix::adjust_pvalue() %>%
                    rstatix::add_significance("p.adj")

#可视化绘制
stat.test <- stat.test %>% add_xy_position(x = "supp")
bxp2 <- ggboxplot(df, x = "supp", y = "len", fill = "supp",palette = "jco",
                 facet.by = "dose",
                 ggtheme= hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")) +
   labs(
    title = "Example of <span style='color:#D20F26'> add P.adj values in ggpubr</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>ggpubr::ggboxplot + rstatix::t_test</span>",
    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>")+
   stat_pvalue_manual(stat.test, label = "p.adj") +
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.10))) +
   theme(
    plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                  size = 20, margin = margin(t = 1, b = 12)),
    plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
    plot.caption = element_markdown(face = 'bold',size = 12))
319cb12304be95bf0619c0ebd21332e3.png
Add P Values in group data

不喜欢ggsci包的颜色配色,我们可以使用黑灰色系进行颜色设置,修改成如下代码即可:

ggboxplot(df, x = "supp", y = "len", fill = "supp",palette = c("gray80","gray20"),
                 facet.by = "dose",
                 ggtheme= hrbrthemes::theme_ipsum(base_family = "Roboto Condensed"))

设置palette = c("gray80","gray20") 即可。

「定义P值样式」

如果觉得P值的样式比较单一,也可以自定义P值样式:

#定义P值显示条件
stat.test$custom.label <- ifelse(stat.test$p.adj <=.05,stat.test$p.adj,"ns")
# 可视化绘制

stat.test <- stat.test %>% add_xy_position(x = "supp")
bxp4 <- ggboxplot(df, x = "supp", y = "len", fill = "supp",palette = "jco",
                 facet.by = "dose",
                 ggtheme= hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")) +
   labs(
    title = "Example of <span style='color:#D20F26'> add P.custom values in ggpubr</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>ggpubr::ggboxplot + rstatix::t_test</span>",
    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>")+
   stat_pvalue_manual(stat.test, label = "custom.label") +
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.10))) +
   theme(
    plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                  size = 20, margin = margin(t = 1, b = 12)),
    plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
    plot.caption = element_markdown(face = 'bold',size = 12))
9aeb05e0a80d933ceb2e86228161b2f7.png
Set P Value form

设置P值位科学计数法:

# 添加科学计数法一列
+
stat.test$p.scient <- format(stat.test$p.adj, scientific = TRUE)
+ ····
stat_pvalue_manual(stat.test, label = "p.scient")+
# 其他同上
4f773b6745e27a62eb0f4271dd0b5300.png
Add P Value in scientific form

还可以绘制如下可视化结果:

# 计算P值
stat.test <- df %>%
  t_test(len ~ supp, paired = TRUE) %>%add_significance()
# 可视化绘制
stat.test <- stat.test %>% add_xy_position(x = "supp") 

ggpaired(df, x = "supp", y = "len", fill = "supp",palette = "jco",
                  line.color = "gray", line.size = 0.4,
                  ggtheme= hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")) +
 labs(
    title = "Example of <span style='color:#D20F26'> add P.signif values in ggpubr</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>ggpubr::ggpaired + rstatix::t_test</span>",
    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>")+
   stat_pvalue_manual(stat.test, label = "{p}{p.signif}") +
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.10))) +
   theme(
    plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                  size = 20, margin = margin(t = 1, b = 12)),
    plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
    plot.caption = element_markdown(face = 'bold',size = 12))
66f849099f9822707f8be54117ee31d7.png
Add P Value in ggpaired example

「柱形图P值添加」:统计计算如下:

# 统计计算
stat.test <- df %>% t_test(len ~ dose)%>% add_xy_position(fun = "mean_sd", x = "dose")
#可视化绘制
bp_p <- ggbarplot(df, x = "dose", y = "len", add = "mean_sd", fill = "dose", palette = "jco",
               ggtheme= hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")) +
   stat_pvalue_manual(stat.test, label = "p.adj.signif", tip.length = 0.01)+
   
   labs(
    title = "Example of <span style='color:#D20F26'> ggpubr::ggbarplot with p.adj.signif</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>ggpubr::ggbarplot + rstatix::t_test</span>",
    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>")+
   theme(
    plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                  size = 20, margin = margin(t = 1, b = 12)),
    plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
    plot.caption = element_markdown(face = 'bold',size = 12))
5b49a05b91d8fb211c5de9cd30715f6e.png
Add P Values in ggbarplot

具体的P值样式修改可参看上面代码。以上就是使用R-ggpubr包快速绘制P值的方法介绍,借助了R-rstatix包进行完成,下面小编就介绍一种更简单的绘制P值的方法。

R-ggsignif添加P值

R-ggsignif 包可是专门为绘制P值的第三方包,其实用也较为简单,接下来通过三个小例子解释一下:

「样例一」

ggplot(mpg, aes(class, hwy)) +
  geom_boxplot() +
  geom_signif(
    comparisons = list(c("2seater", "midsize"), c("minivan", "suv")),
    textsize = 6,map_signif_level = function(p) sprintf("P = %.2g", p)
  ) +
  ylim(NA, 48) +
   labs(
    title = "Example of <span style='color:#D20F26'>ggsignif::geom_signif function</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>geom_signif()</span>",
    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +
  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")  +
  theme(
    plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                  size = 20, margin = margin(t = 1, b = 12)),
    plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
    plot.caption = element_markdown(face = 'bold',size = 12))
4152218d4a6d08061b797ee42cd75d86.png
Add and Custom P Values in geom_signif()

注意:

geom_signif(
    comparisons = list(c("2seater", "midsize"), c("minivan", "suv")),
    textsize = 6,map_signif_level = function(p) sprintf("P = %.2g", p)
  )

添加P值并修改P值样式。

「样例二」

ggplot(iris, aes(Species, Sepal.Width)) +
  geom_boxplot(aes(fill=Species)) +
  geom_signif(
        comparisons = list(c("versicolor", "setosa"),c("versicolor","virginica")),
        textsize = 6,map_signif_level = function(p) sprintf("P = %.3g", p),
        y_position = c(4.5, 4.))+
  scale_fill_jco()+
  ylim(NA, 5) +
   labs(
    title = "Example of <span style='color:#D20F26'>ggsignif::geom_signif function</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>geom_signif()</span>",
    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +
  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")  +
  theme(
    plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                  size = 20, margin = margin(t = 1, b = 12)),
    plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
    plot.caption = element_markdown(face = 'bold',size = 12))
724c0d38b126f155f42f2be6421a760d.png
Add and Custom P Values in geom_signif()

通过:

y_position = c(4.5, 4.)

设置P值的具体添加位置。

「样例三」

test_data<- data.frame(
  Group = c("S1", "S1", "S2", "S2"),
  Sub = c("A", "B", "A", "B"),
  Value = c(2, 5, 7, 8)
)
# 可视化绘制
ggplot(test_data, aes(x = Group, y = Value)) +
  geom_bar(aes(fill = Sub), stat = "identity", position = "dodge", width = .6) +
  geom_signif(
    y_position = c(5.3, 8.3), xmin = c(0.8, 1.8), xmax = c(1.2, 2.2),
    annotation = c("**", "NS")) +
  geom_signif(
    comparisons = list(c("S1", "S2")),size=.7,
    y_position = 9.3, vjust = 0.2)+ 
  scale_fill_grey() +
  labs(
    title = "Example of <span style='color:#D20F26'>ggsignif::geom_signif function</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>geom_signif() in geom_bar</span>",
    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +
  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed") +
  theme(
    plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                  size = 20, margin = margin(t = 1, b = 12)),
    plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
    plot.caption = element_markdown(face = 'bold',size = 12))
23912a63e243cd6e9b86b7eca11dde0c.png
Add P Vlaus on geom_bar() in geom_signif()

通过:

y_position = c(5.3, 8.3), xmin = c(0.8, 1.8), xmax = c(1.2, 2.2),
    annotation = c("**", "NS")

comparisons = list(c("S1", "S2")),size=.7,
    y_position = 9.3, vjust = 0.2

设置P值显示样式和样式(粗细、位置等)。

是不是觉得使用R-ggsignif包绘制P值更加方便些呢,更多属性设置和其他用法,小伙伴们可去ggsigni包官网进行查阅。

总结

今天这篇推文小编汇总了常见P值的可视化绘制方法,希望对大家有所帮助。更多详细内容,小伙伴们可自行探索哈~~

往期精品(点击图片直达文字对应教程)

23d9b55160287d1b4a704322f09c06e3.png

897b5d3f2c0ee84a3792af914512d5dc.png

d9983cbc565a26f926a30a45cfb573cb.png

a9de40a6e3cee8634efc671d727a17f8.png

ec3baffb682c5b9ddc90cde0d1f68389.png

97e137cb05e16cc669c42e892fc85953.png

2c08ee45dbda352e973fc686859d33a7.png

0dfea58b0d7d01974c9d57d84caaac4f.png

d307948a4d12e2ea17f6cdacee37d25d.png

6f68562aaff1f080305aa5d8d884d2dc.png

5218fb27adcec72e722afdd636bf1023.png

3e5b000210b0f30b753a753f070d9bd1.png

562724dbd8da0e541950ff7df2105df8.png

199535778cf24cd5ffc5c5f3e570fa2f.png

d0724a8f9af069abddf0b3f3127e7cbc.png

1b33c8d834618d5d2ece2c01b68e9aae.png

1a18bbd980e1a4c7c382bfa27cc142de.png

7cd8e339a0cf0b797453b0c8777d9ca3.png

16452fcba0c9905d7ea77f91cd5a3ad8.png

969f9fd39ed4cd623b22cf857846b646.png

274f1c36cb2f818078c758be08dca14a.png

746c6419823304d712d9c2327d903691.png

0803b8d25181774a93544d397bd9d3cc.png

7a39baaab41aa71826e961fc392a8505.png

adba93fc4aa052d567782f57c9a00d2c.png

d3dff45ed20afa604247a1f63266f508.png

8fed9db6d7b2e2fc9a73b3bc287b8248.png

a6fbb6fffd091103c6d9815a0b28a621.png

机器学习

后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集

a74533b9cec378f480cad8219639cf08.png

d6400c4146947a7a9ff68d75f40e3f31.png

c876c3ef2f31c01f9c0cc12b5bf696cc.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值