热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用ggsignif优雅添加显著性标记详解

这篇文章主要为大家介绍了使用ggsignif优雅添加显著性标记详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多

引言

该包目前仅适用于利用 ggplot2 进行绘制的图形

我们在利用ggplot2进行数据可视化的时候经常会需要对两组数据进行比较,并添加显著性标记,自己学习之余,也给大家分享一个好用的添加显著性标记的包:ggsignif

ggsignif: Significance Brackets for ‘ggplot2’

PART1:安装

#从cran安装:
install.packages("ggsignif")
#从GitHub安装(最新版):
install.packages("remotes")
remotes::install_github("const-ae/ggsignif")

PART2:函数部分参数详解

?geom_signif

函数帮助文档如下:

geom_signif(
  mapping = NULL,
  data = NULL,
  stat = "signif",
  position = "identity",
  na.rm = FALSE,
  show.legend = NA,
  inherit.aes = TRUE,
  comparisOns= NULL,
  test = "wilcox.test",
  test.args = NULL,
  annotatiOns= NULL,
  map_signif_level = FALSE,
  y_position = NULL,
  xmin = NULL,
  xmax = NULL,
  margin_top = 0.05,
  step_increase = 0,
  extend_line = 0,
  tip_length = 0.03,
  size = 0.5,
  textsize = 3.88,
  family = "",
  vjust = 0,
  parse = FALSE,
  manual = FALSE,
  orientation = NA,
  ...
)

在这些里面,我们常用的一些参数就是这些啦:

· comparisons #指定比较对象,是一个由长度为2的向量组成的列表

· test #指定使用的检验方法,包括 wilcox.test 和 t.test

· comparisons #指定比较对象,是一个由长度为2的向量组成的列表
· test #指定使用的检验方法,包括 wilcox.test 和 t.test
· annotations #指定注释的内容
· map_signif_level #布尔型变量,如果为TRUE,就用诸如***的形式来展示显著性差异
· y_position #指定标记在y轴方向上的坐标,是个数字向量
· xmin, xmax #指定标记在x轴方向上的位置,是个数字向量
· tip_length #指定标记小竖线的长度,是个数字向量
· size #指定标记尺寸,即线条的粗线
· textsize #指定标记中文字部分的大小
· family #指定标记中文字部分的字体
· vjust #指定标记部分中的文字与标记中的短横线之间的距离,负值在横线上方,正值在下方
· orientation #指定整个图的方向,一般不会修改,如果想让图“躺下”,就设置成为"y"

PART3:示例——以ggplot2内置数据集mpg为例

问题描述:

我们想绘制一个箱型图,横轴为每辆车的车型,纵坐标为hwy,使用mpg数据集,其结构如下:

library(ggplot2)
head(mpg)

# A tibble: 6 x 11
  manufacturer model displ  year   cyl trans      drv     cty   hwy fl    class  
                          
1 audi         a4      1.8  1999     4 auto(l5)   f        18    29 p     compact
2 audi         a4      1.8  1999     4 manual(m5) f        21    29 p     compact
3 audi         a4      2    2008     4 manual(m6) f        20    31 p     compact
4 audi         a4      2    2008     4 auto(av)   f        21    30 p     compact
5 audi         a4      2.8  1999     6 auto(l5)   f        16    26 p     compact
6 audi         a4      2.8  1999     6 manual(m5) f        18    26 p     compact

开始绘制:

library(ggsignif)

ggplot(data = mpg, aes(x = class, y = hwy)) + 
  geom_boxplot(aes(group = class, fill = class), size = 1) + #指定箱子线条宽度为1
  geom_signif(comparisOns= list(c("midsize", "minivan"), c("compact", "midsize")), #指定比较对象
              test = "t.test", #指定检验方法
              y_position = c(40, 47), #指定两个标记在y轴上的坐标,按照前面指定比较对象的顺序
              size = 1, #指定标记中线条的尺寸
              textsize = 5, #指定标记中文字部分的大小
              vjust = -0.3, #指定标记中文字部分与横线之间的距离
              tip_length = c(0.2, 0.45, 0.05, 0.05), #指定短竖线的长度
              map_signif_level = T) + 
  scale_y_continuous(limits = c(10, 55)) +
  theme(legend.position = "none",
        panel.background = element_rect(fill = NA),
        panel.border = element_rect(fill = NA, colour = "black", size = 1),
        axis.title = element_text(size = 15, face = "bold"),
        axis.text.x = element_text(size = 12, hjust = 1, angle = 45, color = "black"),
        axis.title.y = element_text(size = 12, color = "black"))

成图:

丑是丑了点,但还是凑合,毕竟针对主题的修改美化没有花大力气。需要注意的几个点:

关于y轴范围:

y轴的范围在这里很重要,范围不合适会直接导致显著性标记溢出图外,显示不全,所以可以用 scale_y_*(limits = numeric.vecter) 或者 ylab() 指定范围,保证好看的前提下尽可能大一点。

关于短竖线的长度:

短竖线长度指定的数值向量中数值的顺序应该是与你指定的比较对象的出现顺序是一致的,这个参数可以慢慢一个一个修改,多试试就好了。

PART4:来点花的——何必一定是显著性标记?

前面的函数帮助文档里有 annotations 参数,让人不禁想试试(狗头)。

话不多说,直接开始:

问题描述:我们想把上面的图中的 NS. 和 *** 分别替换成为字母 A 和 B。

一样的代码:

ggplot(data = mpg, aes(x = class, y = hwy)) + 
  geom_boxplot(aes(group = class, fill = class), size =1) +
  geom_signif(comparisOns= list(c("midsize", "minivan"), c("compact", "midsize")),
              annotatiOns= c("B", "A"), #差别在这儿
              y_position = c(40, 47),
              size = 1,
              textsize = 5,
              vjust = -0.3,
              tip_length = c(0.2, 0.45, 0.05, 0.05)) + 
  scale_y_continuous(limits = c(10, 55)) +
  theme(legend.position = "none",
        panel.background = element_rect(fill = NA),
        panel.border = element_rect(fill = NA, colour = "black", size = 1),
        axis.title = element_text(size = 15, face = "bold"),
        axis.text.x = element_text(size = 12, hjust = 1, angle = 45, color = "black"),
        axis.title.y = element_text(size = 12, color = "black"))

出图:

PART5:让图“躺”下来?

  • 第一种方法:使用 orientation 参数:
ggplot(data = mpg, aes(x = hwy, y = class)) +  #这里改了
  geom_boxplot(aes(group = class, fill = class), size =1, orientation = "y") +
  geom_signif(comparisOns= list(c("midsize", "minivan"), c("compact", "midsize")),
              test = "t.test",
              y_position = c(40, 47),
              size = 1,
              textsize = 5,
              vjust = -0.3,
              tip_length = c(0.2, 0.45, 0.05, 0.05),
              map_signif_level = T,
              orientation = "y") +  #这里改了
  scale_x_continuous(limits = c(10, 55)) + #这里改了
  theme(legend.position = "none",
        panel.background = element_rect(fill = NA),
        panel.border = element_rect(fill = NA, colour = "black", size = 1),
        axis.title = element_text(size = 15, face = "bold"),
        axis.text.x = element_text(size = 12, hjust = 1, angle = 45, color = "black"),
        axis.title.y = element_text(size = 12, color = "black"))
  • 第二种方法:使用 coord_flip()
ggplot(data = mpg, aes(x = class, y = hwy)) + 
  geom_boxplot(aes(group = class, fill = class), size =1) +
  geom_signif(comparisOns= list(c("midsize", "minivan"), c("compact", "midsize")),
              test = "t.test",
              y_position = c(40, 47),
              size = 1,
              textsize = 5,
              vjust = -0.3,
              tip_length = c(0.2, 0.45, 0.05, 0.05),
              map_signif_level = T) + 
  scale_y_continuous(limits = c(10, 55)) +
  theme(legend.position = "none",
        panel.background = element_rect(fill = NA),
        panel.border = element_rect(fill = NA, colour = "black", size = 1),
        axis.title = element_text(size = 15, face = "bold"),
        axis.text.x = element_text(size = 12, hjust = 1, angle = 45, color = "black"),
        axis.title.y = element_text(size = 12, color = "black")) +
  coord_flip() #只改了这里

出图:

以上就是使用ggsignif优雅添加显著性标记详解的详细内容,更多关于ggsignif添加显著性标记的资料请关注编程笔记其它相关文章!


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
author-avatar
王永星2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有