之前我在简书上写过几个画柱状图和统计的教程,随着对R语言的熟练,加上一些新包的出现,其实已经有了更简单的办法和代码,我这人很懒,能少写代码就少写,虽然很多啰嗦的代码可以让你更清楚的了解它的含义。

目前而言,ggplot2ggpubr是最常用的统计作图工具,当然也有ggstatsplot这种更专业的统计作图包,不过个人而言,我觉得最好的作图工具还是ggplot2,但是ggpubr的代码更简单,两者各有各的好,熟悉的话一起使用也没有问题。

柱状图可以很好的看出两组或者多组的比较趋势,也是最常用的统计方法,我们的PCR和WB都离不开它,当然用Prisim可以很简单的出图,不过颜值差了很多。

比如我们得出了三种基因在对照组和处理组的结果,并做了三重复,我们先把表格读进来,表格可以是这样的:

data<-read.csv("/Users/mac/Desktop/bar.csv")
## Warning in read.table(file = file, header = header, sep = sep, quote = quote, :
## incomplete final line found by readTableHeader on '/Users/mac/Desktop/bar.csv'
gene Contraol1 Contraol2 Contraol3 Treat1 Treat2 Treat3
GeneA 1.0917683 0.8745827 1.0472941 22.11061 18.85227 22.57520
GeneB 1.0570180 1.0570180 0.8950251 51.26847 43.41134 46.85074
GeneC 0.9749049 0.9681707 1.0594631 14.15592 16.37398 19.33755

作图要用长数据,我们可以转换一下,当然也可以直接用Excel先做成长数据的格式

library(reshape2) 
bar<-melt(data,
                 id.vars = c('gene'), # 定义需要保留的部分
                 variable.name='sample', #定义样本的列名
                 value.name='value') #定义数值的列名
bar$group=rep(c('control', 'treat'), each = 9) ## 新增一个分组
gene sample value group
GeneA Contraol1 1.0917683 control
GeneB Contraol1 1.0570180 control
GeneC Contraol1 0.9749049 control
GeneA Contraol2 0.8745827 control
GeneB Contraol2 1.0570180 control
GeneC Contraol2 0.9681707 control
GeneA Contraol3 1.0472941 control
GeneB Contraol3 0.8950251 control
GeneC Contraol3 1.0594631 control
GeneA Treat1 22.1106100 treat
GeneB Treat1 51.2684700 treat
GeneC Treat1 14.1559200 treat
GeneA Treat2 18.8522700 treat
GeneB Treat2 43.4113400 treat
GeneC Treat2 16.3739800 treat
GeneA Treat3 22.5752000 treat
GeneB Treat3 46.8507400 treat
GeneC Treat3 19.3375500 treat

ggplot2作图

我们先用ggplot2画图看看趋势,这里有一个办法可以一步计算均数和标准差,那就是加载ggpubr

library(ggplot2) 
suppressMessages(library(ggpubr))
p<-ggplot(bar,
       aes(group,value,color=group,fill=group))+
  geom_bar(stat="summary",fun=mean,position="dodge")+ #柱状图
  stat_summary(fun.data = 'mean_sd', geom = "errorbar", width = 0.5,position = position_dodge(0.9))+ ##一定要加载ggpubr,调用函数可以计算均数、标准差、CI等
  facet_grid(~gene,scales = 'free')+ #分面
#  theme_minimal(base_size = 13)+ #自己定义一个主题和字体大小
  scale_color_manual(values = c('steelblue','brown'))+ # 定义一下配色
  scale_fill_manual(values = c('steelblue','brown'))+ #填充的配色也定义一下
    labs(x=NULL,y='Relative gene expression')
p

## 我们再做一个t检验,当然首先还是要看能不能用t检验,这个可以参照我之前的教程
p1<-p+
  geom_signif(comparisons = list(c("control","treat")),map_signif_level=T,test = 't.test')
p1

可以看到对照组和处理组的差别很大,有时候甚至看不到对照组的误差棒,这个时候我们可以用Y叔开发的ggbreak给它截断,然后还可以给每个数据标上一个点,这样可以清楚的知道真实数据,这里推荐用geom_jitter()定义数据(之前我用过geom_dotplot(),但是最后的结果是底下的那个点特别大,这个问题我跟Y叔的团队反映过,得到的答复是改不了) 不知道为什么截断以后,显著性标识遮挡了,可能也是bug,AI调一下就可以

library(ggbreak) # 截断的包
library(ggsignif) # 统计
p1+geom_jitter(color='gray', #定义一个点的颜色
              size=2, width = 0.2)+
  scale_y_break(c(1.5, 10), scales=0.8) #设置上下截断的坐标

这样一个近乎完美的柱状图就做好。


ggpubr作图

当然ggpubr的代码更简单,一步到位,一个包里就包含了作图和统计,但是限制的地方也多,很难一次性做到完美,比如用了ggbreak就看不到头,

library(ggpubr)
ggbarplot(bar,'group','value',
          fill = 'group',color = 'group',
          facet.by = 'gene',
          palette = c('steelblue','brown'),
          ggtheme = theme_bw(),legend = 'none',
          add = c('mean_sd','jitter'),
          ,add.params = list(color='black'))+ 
  stat_compare_means(comparisons = list(c("control","treat")),
                     label = "p.signif", method = 't.test')

作者简介

欧阳松石河子大学医学院第一附属医院泌尿外科主治医师、讲师、医学博士。 擅长泌尿及男性生殖系统常见疾病的诊疗,对男性生殖医学疾病具有较深研究熟悉各种泌尿男科手术及腔镜微创诊疗技术, 同时擅长R语言在生物信息方面的研究。

欧阳松 (2021). 纯纯的ggplot2画好看的柱状图,统计、分面. 欧阳松的博客. https://swcyo.rbind.io/course/%E7%BA%AF%E7%BA%AF%E7%9A%84ggplot2%E7%94%BB%E5%A5%BD%E7%9C%8B%E7%9A%84%E6%9F%B1%E7%8A%B6%E5%9B%BE%E7%BB%9F%E8%AE%A1%E5%88%86%E9%9D%A2/

BibTeX citation

@misc{
  title = "纯纯的ggplot2画好看的柱状图,统计、分面",
  author = "欧阳松",
  year = "2021",
  journal = "欧阳松的博客",
  note = "https://swcyo.rbind.io/course/%E7%BA%AF%E7%BA%AF%E7%9A%84ggplot2%E7%94%BB%E5%A5%BD%E7%9C%8B%E7%9A%84%E6%9F%B1%E7%8A%B6%E5%9B%BE%E7%BB%9F%E8%AE%A1%E5%88%86%E9%9D%A2/"
}
.. ... ...
本站总访问量次; 本站访客数人次; 本文总阅读量次;