跟着JoVE学作图:R语言ggplot2做簇状柱形图并添加显著性标记的完整示例

昨天的推文发出后,好多人留言问如何添加显著性标记,今天的推文介绍下如何在簇状柱形图的基础上添加显著性标记

添加显著性标记用到的是ggsignif包中的geom_signif()函数

在昨天推文的基础上,如果是利用带重复的原始数据作图,然后利用geom_signif()函数作图的时候我遇到了报错,暂时还不知道如何解决。等找到原因了再来介绍。

查找资料的过程中找到了一篇论文

image.png

https://www.jove.com/t/60139/nest-building-behavior-as-an-early-indicator-behavioral-deficits
Nest Building Behavior as an Early Indicator of Behavioral Deficits in Mice

论文里有一幅图

image.png

提供了代码和数据,今天的推文来学习一下他的代码是如何写的

首先是准备数据

他这里是直接通过代码输入数据,没有将数据存储到文件里

Genotype = c("Wildtype", "APOE4", "Wildtype", "APOE4", "Wildtype", "APOE4", "Wildtype", "APOE4")
Material = c("Shredded paper","Shredded paper","Square","Square","Bedding","Bedding","Twist", "Twist")
Mean = c(4.77,3.52, 2.57, 1.39, 2.73, 1.73, 2.63, 1.30)
se = c(0.16, 0.24, 0.36, 0.06, 0.25, 0.26, 0.29, 0.05) 
df = data.frame(Genotype, Material, Mean, se)
df

最后的数据如下


image.png

相当于是用原始数据先算了平均值和标准差

这里的赋值符号他直接用的等于号=,而没有用<-

给因子变量指定水平

df$Genotype<- factor(df$Genotype, levels=(c("Wildtype", "APOE4")))
df$Material<- factor(df$Material, levels=(c("Shredded paper","Square", "Bedding", "Twist")))

加载需要的R包

library(ggplot2)
library(ggsignif)

簇状柱形图的代码

ggplot(df, aes(x=Material, y = Mean, fill=Genotype))+
  geom_bar(position=position_dodge(), stat="identity")+
  scale_fill_manual(values=c("#CCCCCC", "#666666", "#CCCCCC", "#666666", "#CCCCCC", "#666666", "#CCCCCC", "#666666"))+
  geom_errorbar(aes(ymin=Mean-se, ymax=Mean+se), 
                width=0.2,
                position=position_dodge(0.9))+  #this line of code makes the bar that extends across the 3-nonsig materials
  scale_y_continuous(name="Average score\n", expand=c(0,0))+
  geom_text(aes(x=1, y=5.9, label="Stretch It"), vjust=-1)+
  scale_x_discrete(name="\nProvided materials")+
  ggtitle("          Averaged scores of nests constructed by wildtype or APOE4 mice\n")+ #added chunk of space to center title in jpeg file
  theme(plot.title=element_text(lineheight=0.8, face="bold", hjust=0.5))+
  theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank(),
        panel.background=element_blank(), axis.line=element_line(color="black")) -> p1
p1
image.png

添加显著性标记

p1+
  geom_signif(data=df,
              aes(xmin=0.75, xmax=1.25, annotations="*", y_position=5.25),
              textsize = 5, vjust = 0.05, tip_length = c(0.04, 0.2),
              manual=TRUE)
image.png

会遇到警告信息Warning message: Ignoring unknown aesthetics: xmin, xmax, annotations, y_position提示未知参数,但是能够出图

这种还是需要自己用原始数据做统计分析,知道显著性以后再往上添加

另外3组也是一样的方式添加

p1+
  geom_signif(data=df,
              aes(xmin=0.75, xmax=1.25, annotations="*", y_position=5.25),
              textsize = 5, vjust = 0.05, tip_length = c(0.04, 0.2),
              manual=TRUE)+
  geom_signif(data=df,
              aes(xmin=1.75, xmax=2.25, annotations="*", y_position=3.30),
              textsize = 5, vjust = 0.05, tip_length = c(0.04, 0.3),
              manual=TRUE) +
  geom_signif(data=df,
              aes(xmin=2.75, xmax=3.25, annotations="*", y_position=3.30),
              textsize = 5, vjust = 0.05, tip_length = c(0.04, 0.2),
              manual=TRUE)+
  geom_signif(data=df,
              aes(xmin=3.75, xmax=4.25, annotations="*", y_position=3.30),
              textsize = 5, vjust = 0.05, tip_length = c(0.04, 0.3),
              manual=TRUE)

最后是添加第一组和另外三组的显著性标记

p1+
  geom_signif(data=df,
              aes(xmin=0.75, xmax=1.25, annotations="*", y_position=5.25),
              textsize = 5, vjust = 0.05, tip_length = c(0.04, 0.2),
              manual=TRUE)+
  geom_signif(data=df,
              aes(xmin=1.75, xmax=2.25, annotations="*", y_position=3.30),
              textsize = 5, vjust = 0.05, tip_length = c(0.04, 0.3),
              manual=TRUE) +
  geom_signif(data=df,
              aes(xmin=2.75, xmax=3.25, annotations="*", y_position=3.30),
              textsize = 5, vjust = 0.05, tip_length = c(0.04, 0.2),
              manual=TRUE)+
  geom_signif(data=df,
              aes(xmin=3.75, xmax=4.25, annotations="*", y_position=3.30),
              textsize = 5, vjust = 0.05, tip_length = c(0.04, 0.3),
              manual=TRUE)+
  geom_signif(data=df,
              aes(xmin=1, xmax=3, annotations="**", y_position=5.7),
              textsize = 5, vjust = -0.0000025, tip_length = c(0.04, 0.35),
              manual=TRUE)+
  geom_segment(aes(x = 2, y = 3.98, xend = 4, yend = 3.98))
image.png

geom_segment()函数起到的作用和annotate()函数是差不多了,代码比较繁琐,而且还需要额外单独做显著性分析。还需要仔细学习下geom_signif()函数的用法,学习如何在簇状柱形图的基础上自动添加显著性检验的结果

欢迎大家关注我的公众号

小明的数据分析笔记本

小明的数据分析笔记本 公众号 主要分享:1、R语言和python做数据分析和数据可视化的简单小例子;2、园艺植物相关转录组学、基因组学、群体遗传学文献阅读笔记;3、生物信息学入门学习资料及自己的学习笔记!

你可能感兴趣的:(跟着JoVE学作图:R语言ggplot2做簇状柱形图并添加显著性标记的完整示例)