分享

嵌套条形图的R语言实现

 松哥精鼎统计 2020-10-23

    前期松哥推送一张美图,并用Graphpad Prism进行模拟。一位才女夏雪留言说用R语言模拟,并供稿如下,分享与大家一同学习!

多嵌套图拼接的R语言实现

《这张图好美,你知道怎么做的吗?》ggplot2仿图


这次基于ggplot2的尝试主要源于松哥近期的一篇推送《这张图好美,你知道怎么做的吗?》,感慨于Graphpad Prism作图的简洁,也尝试用ggplot2还原了这个嵌套图,权当对两种软件的绘图模块进行一个比较,希望能给各位小伙伴提供一个不同的视角。

No.1

原文研究设计及图片还原思路

首先来看一下文献的原图吧~

原图

原文作者在对不同年龄(幼鼠和成年鼠),不同性别(雌/雄)进行某种刺激后,在7个时间点(1为刺激前,6为最后1次刺激,7为刺激后一段时间)分别对3个效应指标进行了测量。在进行结果展示时,作者放弃了常规的统计表格,选择了上图的形式,按照年龄,性别分为4层,每层3个子图,分别反映3个不同的指标

不难看出,原图由12个嵌套图组成,每个嵌套图又由1个主图和1个子图拼接而成。其中,主图采用散点误差棒结合的形式展示了某效应指标在7个时间点的均值和标准误,而每个时点与刺激前的差异显著性则以“*”的形式进行标注;子图则为柱状图误差棒的结合,主要比较了最后一次刺激及刺激后与刺激前效应指标水平的差异,同样也标注了两两比较的差异显著性,与主图的区别是,这里选择了以横线对两个比较时点进行了标注。

基于以上思路,小x利用R软件的ggplot2包对原图进行了还原:

仿图

简单地说,除了外边框(合理怀疑原图的边框是AI或者PS后期处理的)和坐标轴没有完全实现(x轴时间点6和7之间截断失败)外,其他还算是基本还原了。

No.2

嵌套图实现

借助ggplot2ggsignif包,小x对嵌套图A进行了还原。两个包的说明文档可以参考:

https://cran./web/packages/ggplot2/index.html

https://github.com/const-ae/ggsignif

首先,生成模拟数据并加载所需的R包:

#加载R包

library(ggplot2) #绘图

library(ggsignif) #显著性绘制

#图A模拟数据

group<-c(1,2,3,4,5,6,7) #分组

estimate<-c(15,8,7.5,6,7,5,12) #均值

lower<-c(14,7,6.5,5,6,4,11) #误差限下限

upper<-c(16,9,8.5,7,8,6,13) #误差限上限

a<-data.frame(group,estimate,lower,upper)

#图A'模拟数据

b<-a[c(1,6,7),] 

b$group<-as.factor(b$group) #将时间点1,6,7处理为因子形式,以便在x轴上等距显示各时间点效应值。

自定义图片的主题:

windowsFonts(

myFont = windowsFont("Arial Unicode MS")

#加载所需字体:Arial Unicode MS

mytheme<-theme(

axis.line=element_line(size=0.5,colour="black"), 

axis.title=element_text(family="myFont",colour="black", size=12),

axis.text=element_text(family="myFont",colour="black", size=12),

legend.background=element_blank(),

legend.key=element_blank(),

legend.title=element_blank(),

panel.background=element_blank(),

panel.border=element_blank(),

panel.grid=element_blank()

)  #设置图片坐标轴(axis),图例(legend)及面板(panel)

利用散点图(geom_point)和误差棒(geom_errorbar)的叠加,绘制嵌套主图p1,并手动标注(geom_text)显著性水平:

p1<-ggplot(data=a,aes(x=group))+

#散点图

geom_point(aes(y=estimate),size=4,colour=3)+

#误差限

geom_errorbar(aes(ymin=lower,ymax=upper),width=0.2,size=0.8,colour=3)+

#设置坐标轴

scale_y_continuous(breaks=c(0,5,10,15,20), limits=c(0,23))+

scale_x_continuous(breaks=c(1,2,3,4,5,6,7),limits=c(0.5,10.5))+

#标注显著性水平          

geom_text(aes(y=upper+0.5), label=c("","***","***","***","***","***",""),colour=1,size=5)+

#设置x轴,y轴及标题

labs(x="Stimulation",y="DA concentration(uM)",title="A")+

 #设置主题 

mytheme

利用条形图(geom_bar)和误差棒(geom_errorbar)的叠加,绘制嵌套子图p2,并借助ggsignif包(geom_signif)标注组间差异显著性:

p2<- ggplot(data=b,aes(x=group))+

#条形图

geom_bar(aes(y=estimate),stat="identity",width=0.4,fill=3)+

#误差限

geom_errorbar(aes(ymin=lower,ymax=upper),width=0.2,size=0.8,colour=3)+

#标注显著性水平    geom_signif(stat="identity",data=data.frame(x=c(1,2),  xend=c(2,3), y=c(16.5,13.5), annotation=c(" * ", " *** ")), aes(x=x,xend=xend, y=y, yend=y, annotation=annotation), size=5)+

#设置坐标轴

scale_y_continuous(breaks=c(0,5,10,15,20),limits=c(0,20))+

#设置x轴,y轴及标题

labs(x="",y="DA concentration(uM)",title="A'")

#设置主题

mytheme

利用生成ggplotGrob() 生成图形对象列表(grob, graphical object)后,利用annotation_custom通过添加注释的方式,向图形内部添加子图:

g<-ggplotGrob(p2)

p01<-p1+ annotation_custom(

         g,xmin=7.5,xmax=10.5,ymin=12,ymax=25)

No.3

嵌套图拼接

类似地,可以完成其余11幅嵌套图(p02-p12)的绘制。

对于图片的拼接,小x利用了gridExtra包实现,说明文档可以参考:

https://cran./web/packages/gridExtra/index.html

png(file = "C:/R/COPY.png", res =600, 

     width =10000, height =10000)

grid.arrange(p01,p02,p03,p04,p05,p06,p07,

     p08,p09,p010,p011,p012,ncol=3)

dev.off()

嗯,到目前为止,图片就基本还原了。至于外边框和标注,各位小伙伴就借助AI和PS进行美化吧。希望你们觉得有意思。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多