R堆叠柱状图各成分连线画法:突出展示组间物种丰度变化

作者:朱微金 李陈浩 堆叠柱状图连线画法提出问题 18年1月29日宏基因组转载了中科院生态中心邓晔组的文章《土壤细菌定量方法结合相对丰度分析揭示种群的真实变化 》。其中的图3基于堆叠柱状图...

作者:朱微金 李陈浩

堆叠柱状图连线画法提出问题

18年1月29日宏基因组转载了中科院生态中心邓晔组的文章《土壤细菌定量方法结合相对丰度分析揭示种群的真实变化 》。其中的图3基于堆叠柱状图,添加组间各成分连线,可以更容易的观察和比较组间的变化。如下图:

image

我在很多文章中也见过,一直没有学会具体的做法。这回正好身边的人会做,就问了一个作者,结果回复是origin画的,有个选项就可以添加组间连线。

现在方法是有了,不过我还是喜欢用R来画图,因为每一个细节的修改都落实的代码上,可见可重复。

而窗口操作类的软件,操作过程是不容易被记录的,别人也很难重复。

我下午将此问题放在了宏基因组0讨论群中,问是否有R包或现成的函数一句话实现在堆叠图中添加组间连线。

获取专业解答

李陈浩老师首先説写两句R就搞定。可是以我的R水平,虽然学过R in action,还只是会按帮忙使用包,修改代码的水平,很难写代码实现想法。

同时李海敏、沈伟等几位老师,也提供了众多解决方案,如ggalluvial,这个更炫酷,功能过于强大,我会在下一次分享中把中文笔记和使用心得带给大家。 image

到了晚上,新加坡的李陈浩老师己经将我要的需求帮助写好了,大赞。如下,我略微修改并注释:

# 绘图包、数据清洗、表格宽转长
library(ggplot2)
library(tidyverse)
library(reshape2)

# 读生一个测试数据宽表格
df=data.frame(
  Phylum=c("Ruminococcaceae","Bacteroidaceae","Eubacteriaceae","Lachnospiraceae","Porphyromonadaceae"),
  GroupA=c(37.7397,31.34317,222.08827,5.08956,3.7393),
  GroupB=c(113.2191,94.02951,66.26481,15.26868,11.2179)
)

# melt转换为长表格为ggplot2绘图通用格式
# geom_segment添加直线和曲线,arrange按门水平名称字母降序排列;cumsum先将数值累计,再用mutate取代;现在己有两组间的高度位置,再设置X轴位置1.25, 1.75, Y位置
ggplot(melt(df), aes(x=variable, y=value, fill=Phylum)) + 
  geom_bar(stat = "identity", width=0.5, col='black')  + 
  geom_segment(data=df %>% arrange(by=desc(Phylum)) %>% mutate(GroupA=cumsum(GroupA)) %>% mutate(GroupB=cumsum(GroupB)), aes(x=1.25, xend=1.75, y=GroupA, yend=GroupB))

image

有模板改参数我喜欢

即然有了画两组的模板,仔细读一读代码,改成三组的应该不难,代码如下:

# 画三个组间比较

# 读生一个测试数据宽表格
df=data.frame(
  Phylum=c("Ruminococcaceae","Bacteroidaceae","Eubacteriaceae","Lachnospiraceae","Porphyromonadaceae"),
  GroupA=c(37.7397,31.34317,222.08827,5.08956,3.7393),
  GroupB=c(113.2191,94.02951,66.26481,15.26868,11.2179),
  GroupC=c(123.2191,94.02951,46.26481,35.26868,1.2179)
)

# melt转换为长表格为ggplot2绘图通用格式
# geom_segment添加直线和曲线,arrange按门水平名称字母降序排列;cumsum先将数值累计,再用mutate取代;现在己有两组间的高度位置,再设置X轴位置1.25, 1.75, Y位置
ggplot(melt(df), aes(x=variable, y=value, fill=Phylum)) + 
  geom_bar(stat = "identity", width=0.5, col='black')  + theme_classic()+
  geom_segment(data=df %>% arrange(by=desc(Phylum)) %>% mutate(GroupA=cumsum(GroupA)) %>% mutate(GroupB=cumsum(GroupB)), aes(x=1.25, xend=1.75, y=GroupA, yend=GroupB))+ 
  geom_segment(data=df %>% arrange(by=desc(Phylum)) %>% mutate(GroupB=cumsum(GroupB)) %>% mutate(GroupC=cumsum(GroupC)), aes(x=2.25, xend=2.75, y=GroupB, yend=GroupC))
# 添加theme_classic()修改主题样式,这个经典主题我更喜欢
# xxend分别为起始和终止,12组间X值起始分别为1.251.7523组间则为2.252.75

image

此图比较适合展示时间序列、梯度变化有规律的连续组。因为只能连接相临的组,需要大家想好谁和谁比较很重要。对于需要全部两两比较是无法实现的。

最后感谢万能的宏基因组微信讨论群,我让认识了大家,总在我有困难时,大家无私的帮助我。谢谢你们!

希望我也能尽快成长为小牛,有更多的能力帮忙别人。

猜你喜欢

写在后面

为鼓励读者交流、快速解决科研困难,我们建立了“宏基因组”专业讨论群,目前己有国内外100+ PI,1200+ 一线科研人员加入。参与讨论,获得专业解答,欢迎分享此文至朋友圈,并扫码加主编好友带你入群,务必备注“姓名-单位-研究方向-职称/年级”。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍末解决群内讨论,问题不私聊,帮助同行。 image

学习扩增子、宏基因组科研思路和分析实战,关注“宏基因组” image

点击阅读原文,跳转最新文章目录阅读https://mp.weixin.qq.com/s/5jQspEvH5_4Xmart22gjMA

  • 发表于 2018-02-01 18:37
  • 阅读 ( 6789 )
  • 分类:其他组学

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
不写代码的码农
刘永鑫

工程师

64 篇文章

作家榜 »

  1. 祝让飞 118 文章
  2. 柚子 91 文章
  3. 刘永鑫 64 文章
  4. admin 57 文章
  5. 生信分析流 55 文章
  6. SXR 44 文章
  7. 张海伦 31 文章
  8. 爽儿 25 文章