如何在R的ggplot中使同亚组菌株的条形图相邻排列
问题描述
我有一个数据集,包含三个用于绘图的关注变量。其中变量Subgroups表示菌株所属的亚组,至少有两个菌株属于同一亚组。目前用ggplot绘制条形图时,按Subgroups填充颜色,但条形图按菌株名称(Strain)的字母顺序分散排列,而非同一亚组的菌株条形图相邻展示。需要实现同一亚组的菌株条形图相邻的可视化效果。
当前使用的代码:
ggplot(data = Phylogeny_Pseudomonads_BasicGenomeData, aes(x= Strain, y= genome_size_in_Mb))+ aes(fill = Subgroups, y= genome_size_in_Mb, x=Strain)+ labs(title = "Genome Sizes Across Strains", x= "Strain", y= "Genome Size in Mb")+ scale_x_discrete(guide = guide_axis(angle = 90)) + geom_bar(position="dodge", stat="identity", width = 0.5)
数据集的dput内容:
structure(list(Subgroups = c("Jessenii", "fluorescens", "fluorescens", "gessardii", "gessardii", "fragi", "fragi"), `Species Name + Strain` = c("Pseudomonas umsongensis", "Pseudomonas fluorescens", "Pseudomonas extremaustralis", "Pseudomonas sp.", "Pseudomonas fluorescens", "Pseudomonas psychrophila", "Pseudomonas taetrolens" ), Strain = c("GO16", "SBW25", "DSM17835", "Ag1", "R8", "HA4", "LMG2336"), `refseq assembly` = c("GCF_008824165.1", "GCF_000009225.2", "GCF_900102035.1", "GCF_000006765.1", "GCF_000297195.3", "GCF_000282975.1", "GCF_900104825.1"), genome_size_in_Mb = c(7.4, 6.7, 6.7, 6.3, 7, 5.2, 4.9), `chromosome number` = c("2", "1", "1", "1", "1", "-", "-"), `GC content` = c(59, 60.5, 60.5, 66.5, 61, 56.5, 58 ), `Number of CDS genes` = c(6441, 5974, 6000, 5572, 6307, 4666, 4360), `Genes number` = c(6698, 6154, 6228, 6708, 6440, 4823, 4507)), row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame" ))
解决方案
要实现同一亚组菌株条形图相邻的效果,核心是重新定义Strain的排序规则,让它按Subgroups分组后排列。以下是两种可行方法:
方法1:修改数据集的因子水平
先按Subgroups排序数据集,再将Strain转换为因子并保留排序后的顺序:
library(dplyr) library(ggplot2) # 按Subgroups排序,提取菌株顺序 sorted_strain_list <- Phylogeny_Pseudomonads_BasicGenomeData %>% arrange(Subgroups) %>% pull(Strain) # 将Strain转为因子,指定排序 Phylogeny_Pseudomonads_BasicGenomeData$Strain <- factor( Phylogeny_Pseudomonads_BasicGenomeData$Strain, levels = sorted_strain_list ) # 绘图 ggplot(data = Phylogeny_Pseudomonads_BasicGenomeData, aes(x= Strain, y= genome_size_in_Mb, fill = Subgroups))+ labs(title = "不同菌株的基因组大小", x= "菌株", y= "基因组大小(Mb)")+ scale_x_discrete(guide = guide_axis(angle = 90)) + geom_bar(stat="identity", width = 0.5)
方法2:直接在绘图函数中指定顺序
无需修改原数据集,通过scale_x_discrete的limits参数指定菌株排序:
library(ggplot2) library(dplyr) # 获取按Subgroups排序后的菌株顺序 strain_order <- Phylogeny_Pseudomonads_BasicGenomeData %>% arrange(Subgroups) %>% pull(Strain) # 绘图 ggplot(data = Phylogeny_Pseudomonads_BasicGenomeData, aes(x= Strain, y= genome_size_in_Mb, fill = Subgroups))+ labs(title = "不同菌株的基因组大小", x= "菌株", y= "基因组大小(Mb)")+ scale_x_discrete(limits = strain_order, guide = guide_axis(angle = 90)) + geom_bar(stat="identity", width = 0.5)
补充说明
- 两种方法都能实现同一亚组菌株条形图相邻的效果,可根据习惯选择
- 代码中移除了重复的
aes()映射,简化了代码结构 - 如果需要调整亚组内菌株的排序,可在
arrange()中添加额外变量(如Strain或genome_size_in_Mb)
内容的提问来源于stack exchange,提问作者Sasha M
相关产品推荐
相关产品推荐

