专栏首页数据 学术 商业 新闻统计绘图 | 一行代码添加P值的可视化技巧分享

统计绘图 | 一行代码添加P值的可视化技巧分享

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

  • P值简单介绍
  • 可视化绘制中P值绘制

P值简单介绍

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

,详细的内容,小伙伴们可自行搜索哈~~)

可视化绘制中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))

boxplot with P value

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

+
stat_pvalue_manual(stat.test, label = "p.signif")
+

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

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

Set P Value form

设置P值位科学计数法:

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

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

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

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

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

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

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值的可视化绘制方法,希望对大家有所帮助。更多详细内容,小伙伴们可自行探索哈~~

本文分享自微信公众号 - DataCharm(shujumeili),作者:宁海涛

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-05-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 统计绘图 | 一行代码教你绘制顶级期刊要求配图

    在分享完即可统计又可可视化绘制的优秀可视化包后(具体内容可看统计绘图 | 既能统计分析又能可视化绘制的技能 。就有小伙伴私信问我“需要绘制出版级别的可视化图表有...

    DataCharm
  • 基于R的可视化习题30个

    这里仅仅是针对一个数据集,就是r包airway并且通过assay函数拿到其表达矩阵。

    生信技能树
  • FiveThirtyEight 类型图表 Matplotlib制作

    FiveThirtyEight网站,也称作538,是一个专注于民意调查分析,政治,经济与体育的博客。网站于2008年3月7日建立,其名称来源于美国选举人团中选举...

    DataCharm
  • 生信分析人员如何系统入门R(2019更新版)

    现在回过头来看,很多教程已然过时,当然并不是说的知识点过时,其实linux基本上几十年都没有怎么变动过基础知识的,哪怕你现在搜索到十几年前的linux教学视频,...

    生信技能树
  • 《使用D3设计交互式图表》简读笔记|可视化系列31

    本文是《数据可视化实战:使用D3设计交互式图表》[1]的简要版读书笔记,通过约4000字概览如何用D3做可视化、实践从数据到图形的过程。D3是一个根据数据操纵文...

    蛰虫始航
  • Python-matplotlib 学术散点图 EE 统计及绘制

    之前的绘制图文Python-matplotlib 学术散点图完善Python-matplotlib 学术型散点图绘制 教程中,对学术散点图已经进行了较为完善的绘...

    DataCharm
  • Android编程之播放器MediaPlayer实现均衡器效果示例

    本文实例讲述了Android播放器MediaPlayer实现均衡器效果。分享给大家供大家参考,具体如下:

    砸漏
  • 10个小技巧:快速用Python进行数据分析

    一些小提示和小技巧可能是非常有用的,特别是在编程领域。有时候使用一点点黑客技术,既可以节省时间,还可能挽救“生命”。

    1480
  • Python-matplotlib 散点图绘制02

    这篇推文还是python-matplotlib 散点图的绘制过程,涉及到的内容主要包括matplotlib ax.scatter()、hlines()、vlin...

    DataCharm
  • 数据分析从业者必看!10 个加速 python 数据分析的简易小技巧

    AI 开发者按,一些小的技巧在编程领域可能会非常有用,在数据科学领域同样如此。数据科学爱好者 Parul Pandey 在近日发表了一篇博文,分享了在数据科学中...

    AI研习社
  • Python-matplotlib 散点图配色设计

    这篇推文还是python-matplotlib 散点图的绘制过程,涉及到的内容主要包括matplotlib ax.scatter()、hlines()、vlin...

    DataCharm
  • Matplotlib 气球图 制作

    Matplotlib 制作稍带“艺术”的可视化作品,ggplot2 基于其优秀绘图图层设置及多种拓展绘图包可以较为灵活的完成此类任务,但Matplotlib也不...

    DataCharm
  • Android开发之OpenGL绘制2D图形的方法分析

    本文实例讲述了Android开发之OpenGL绘制2D图形的方法。分享给大家供大家参考,具体如下:

    砸漏
  • Python-matplotlib 商业图表-第5弹

    第一次使用 Markdown Nice 进行公众号编写(其实刚开始运营公众号时也有使用过,奈于代码编辑就放弃,不过,现在“真香”了 ),希望熟悉后定制自己属于自...

    DataCharm
  • JavaScript是如何工作的:渲染引擎和优化其性能的技巧

    当你构建 Web 应用程序时,你不只是编写单独运行的 JavaScript 代码,你编写的 JavaScript 正在与环境进行交互。了解这种环境,它的工作原理...

    Fundebug
  • JavaScript是如何工作的:渲染引擎和优化其性能的技巧

    当你构建 Web 应用程序时,你不只是编写单独运行的 JavaScript 代码,你编写的 JavaScript 正在与环境进行交互。了解这种环境,它的工作原理...

    前端小智@大迁世界
  • 一根飞线的故事-SVG篇

    每年春运和双十一的统计图都因为有飞线动效才更加吸引眼球,今天我要为大家带来一根漂亮飞线要用什么姿势才能生成。

    苏南
  • Python-matplotlib 商业图表绘制05

    第一次使用 Markdown Nice 进行公众号编写(其实刚开始运营公众号时也有使用过,奈于代码编辑就放弃,不过,现在“真香”了 ),希望熟悉后定制自己属于自...

    DataCharm
  • canvas 绘制双线技巧

    最近一个项目,需要绘制双线的效果,双线效果表示的是轨道(类似铁轨之类的),如下图所示:

    用户3158888

扫码关注云+社区

领取腾讯云代金券