不好好做图的NSC系列(八):ggplot2重现Nature文章多组柱状图+散点,这是一场硬仗

最近,看到一篇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'))

image.png

太累了,感觉还是用GraphPad做吧!哈哈哈,不过做出来了还是很得意的!看在这么辛苦的份上,还不点赞,给点赏赐???
最后,需要示例数据和完整代码注释的小伙伴打赏截图,发送公众号,并留下邮箱,我们双手奉上!感谢!

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值