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

发布时间:2023-04-27 09:21:51
堆叠柱状图连线画问题

宏基因组转载了中国科学院生态中心邓叶组的文章《土壤细菌定量方法与相对丰度分析相结合,揭示了种群的真实变化》。图3基于堆叠柱状图,增加了组间成分连接,更容易观察和比较组间的变化。如下图所示:

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

我在很多文章中也看到过,从来没有学过具体的做法。这一次,我周围的人会这么做,所以我问了一位作者。结果,答案是origin绘制的。如果有选择,可以添加组间连接。

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

而窗口操作软件,操作过程不易记录,其他人也难以重复。

下午,我把这个问题放在宏基因组0讨论组中,问堆叠图中是否有R包或现成函数来添加组间连接。

获得专业答案

李陈浩先生先说写两句R就行了。但是在我的R水平上,虽然我学过R in action,它只会帮助使用包,修改代码的水平,很难写代码来实现想法。

同时,李海敏、沈伟等老师也提供了很多解决方案,比如ggaluvial,比较酷,功能太强大。我会在下一次分享中给大家带来中文笔记和使用经验。

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

晚上,新加坡的李陈浩先生写下了我想要的功能,并称赞了我。下面,我稍微修改并注明:

# tidyverse包install安装和加载.packages("tidyverse")library(tidyverse)# 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.268811.2179))# 计算连接起点Y轴坐标,即累计丰度值link_dat <- df %>%  arrange(by=desc(Phylum)) %>%  mutate(GroupA=cumsum(GroupA), GroupB=cumsum(GroupB))# 数据格式转换,用于Ggplot2的宽表格转换为长表格dflot2.long <- df %>% gather(group, abundance, -Phylum)## 或使用reshape2的melt函数## df.long <- reshape2::melt(df, value.name='abundance', variable.name='group')# 堆叠柱状图+组间连线gplot(df.long, aes(x=group, y=abundance, fill=Phylum)) +  geom_bar(stat = "identity", width=0.5, col='black')  +  geom_segment(data=link_dat, aes(x=1.25, xend=1.75, y=GroupA, yend=GroupB))

 

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

我喜欢模板改变参数

即使有两组模板,仔细阅读代码也不难改为三组。代码如下:

# 画三个组间比较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.268、11.2179),  GroupC=c(123.2191、94.02951、46.26481、35.268、1.2179)# melt转换为长表格,ggplot2绘图通用格式# geom_segment添加直线和曲线,arrange按门级名称字母降序排列;cumsum首先累计数值,用mutate代替;现在有两组之间的高度位置,然后设置X轴位置1.25, 1.75, gplottttt位于Y位置(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_添加theme__classic()修改主题风格,我更喜欢这个经典主题# x和xend分别为开始和结束,1、2组间X值分别为1.25和1.75,2、3组间为2.25和2.75

 

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

如何轻松处理三组以上的情况?

如果有更多的组,按照上面的genome_segment逐一添加显示不方便,需要修改的东西太多了。有没有更完美的解决方案?

李老师也给大家写了一个通用代码,只需按格式添加数据即可

# 三组或更多组的绘画方法只需添加数据即可library(tidyverse)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.268、11.2179),  GroupC=c(123.2191、94.02951、46.26481、35.268、1.2179),  GroupD=c(37.7397、31.34317、222.08827、5.08956、3.7393)df.long <- df %>% gather(group, abundance, -Phylum)## 组间连接数据:## 假设第一列是Phylumlink_dat <- df %>%  arrange(by=desc(Phylum)) %>%  mutate_if(is.numeric, cumsum)bar.width <- 0.7link_dat <- link_dat[, c(1,2,rep(3:(ncol(link_dat)-1),each=2), ncol(link_dat))]link_dat <- data.frame(y=t(matrix(t(link_dat[,-1]), nrow=2)))link_dat$x.1 <- 1:(ncol(df)-2)+bar.width/2link__dat$x.2 <- 1:(ncol(df)-2)+(1-bar.width/2)ggplot(df.long, aes(x=group, y=abundance, fill=Phylum)) +  geom_bar(stat = "identity", width=bar.width, col='black')  +  geom_segment(data=link_dat,               aes(x=x.1, xend=x.2, y=y.1, yend=y.2), inherit.aes = F)

堆叠柱状图各成分连线画法:突出展示组间物种丰度变化_数据可视化_05

四组示例(以上代码适用于三组或三组以上)

这幅图更适合显示时间序列和梯度变化规律的连续组。因为只能连接相邻的组,所以我们需要考虑谁和谁更重要。无法实现所有两两个比较。

最后,感谢万能宏基因组微信讨论组,让我认识大家。当我遇到困难时,每个人都会无私地帮助我。非常感谢。

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

上一篇 从原理聊JVM(三):详解现代垃圾回收器Shenandoah和ZGC | 京东云技术团队
下一篇 IDEA用上这十大插件绝对舒服

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题