最近,看到一篇nature文章,整篇文章的图的风格类似于如下图1,因为第一次见这种图,感觉展示效果不错,所以尝试做一下!
Fluhr, L., Mor, U., Kolodziejczyk, A.A. et al. Gut microbiota modulates weight gain in mice after discontinued smoke exposure,Nature,2021.
本来看着Figure1 h很简单,就先复现它了,结果我错了,它真的太麻烦了,网上关于ggplot做多组柱状图深入修饰的教程也比较少。直到最后,我也没有完全复现它的样子。问题是:如何改变分组的填充,但是点的颜色不变!
这篇Nature文章提供了作图数据,在附件Source Data Fig. 1,有Figure1作图需要的所有数据。首先我们读入数据,并通过因子设置变量顺序与原文一致!
setwd("F:/生物信息学/NATURE折线图")
A <- read.csv("A.csv",header = T)
library(ggplot2)
library(forcats)
A$condictions <- as.factor(A$condictions)
A$condictions <- fct_inorder(A$condictions)
A$group <- as.factor(A$group)
A$group <- fct_inorder(A$group)
接着就比较直接了,画柱状图。到这一步,我们需要思考下,一步一步先解决这几个问题,柱状图坐落在坐标上,柱子之间有空隙,改变legend位置为水平,设置x,y轴标题。然后就是这幅图比较特色的地方了,添加分割线,右侧有填充,本来是一个简单的事情,但是由于横坐标不是数字,而是因子,所以这里有点区别。接着添加误差线,我这里选择了stat_summary函数,这个方法比较简单,但是也有自己计算添加的,比较麻烦。这里需要注意的是添加误差线的位置!最后就是比较难的内容了,包括添加散点,添加显著性!到这里真的是做了一天了,但是还是有一个问题没有解决,不能像原文那样,柱子为白色,点为自己的颜色,不知道有没有简单的方法!
ggplot(A, aes(fill=condictions, y=values, x=group))+
geom_bar(position=position_dodge(1),stat="summary",width=0.7,colour = "black",size=1)+
theme_classic(base_size = 12)+
geom_vline(aes(xintercept=as.numeric(as.factor(group))+0.5),linetype=2,cex=1.2)+
geom_rect(aes(xmin=as.numeric(as.factor(group))+0.5,
xmax=Inf, ymin=(-Inf),ymax=Inf),
fill='grey90',color='grey90')+
geom_vline(xintercept =A$condictions,linetype=2,cex=1.2)+
geom_bar(position=position_dodge(1),stat="summary",width=0.7,colour = "black",size=1)+
stat_summary(fun.data = 'mean_se', geom = "errorbar", colour = "black",
width = 0.2,position = position_dodge(1))+
theme(legend.direction = "horizontal", legend.position = "top")+
labs(title = "", y="Fecal calories per g", x = "")+
scale_y_continuous(limits = c(0,6000),expand = c(0,0))+
theme(axis.text.x = element_text(size = 12))+
theme(axis.text.y = element_text(size = 12))+
theme(axis.title = element_text(size = 14))+
geom_jitter(data = A, aes(y = values),size = 3, shape = 21,
stroke = 0.01, show.legend = FALSE,
position = position_jitterdodge(jitter.height=1,dodge.width = 1))+
geom_signif(y_position=c(5000,5000,5000,5500), xmin=c(0.6,1.1,1.6,1.9), xmax=c(0.8,1.3,1.8,2.3),
annotation=c("**","**","****","****"), tip_length=0, size=0.8, textsize = 7,
vjust = 0.3)+
scale_fill_manual(values = c('#5494cc','#e18283','#0d898a','#f9cc52'))
太累了,感觉还是用GraphPad做吧!哈哈哈,不过做出来了还是很得意的!看在这么辛苦的份上,还不点赞,给点赏赐???
最后,需要示例数据和完整代码注释的小伙伴打赏截图,发送公众号,并留下邮箱,我们双手奉上!感谢!