You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 00:50:12