如何在ggplot中重新排列柱状图:按DAS分组并列展示CT与HS柱
解决方案
要实现按DAS分组、每个DAS下CT与HS柱状图并列的效果,你需要调整ggplot的分组逻辑,强制优先按DAS分组,再在每个DAS组内展示不同Treatment的柱。具体修改如下:
修改后的代码
# 先确保DAS是有序因子(按你的实际DAS顺序调整levels) data$DAS <- factor(data$DAS, levels = c("1DAS", "15DAS", "30DAS")) # 替换为你的实际DAS值 ggplot(data, aes(x = Genotype, y = Pn, fill = DAS, group = interaction(DAS, Treatment))) + geom_col_pattern(aes(pattern = Treatment), pattern_color = '#00000050', position = position_dodge(width = 0.7), width = 0.5, color = 'gray50', pattern_angle = 45, pattern_spacing = 0.02) + scale_pattern_manual(values = c('none', 'stripe'), guide = guide_legend(override.aes = list(fill = 'white')) ) + scale_fill_brewer('Species', palette = 'Pastel2', guide = guide_legend(override.aes = list(pattern = 'none')) ) + theme_minimal(base_size = 16) + theme(axis.text.x.bottom = element_text(face = "bold"), panel.spacing.x = unit(0, 'mm'), panel.grid.major.x = element_blank(), axis.text.x = element_text(angle=90))
关键修改说明
- 设置有序DAS因子:将DAS转换为指定顺序的因子,避免ggplot按字母顺序排列(比如"15DAS"排在"1DAS"前面),保证分组顺序符合需求。
- 指定分组逻辑:通过
group = interaction(DAS, Treatment)强制ggplot先按DAS分组,再在每个DAS组内按Treatment拆分,这样每个Genotype下会先展示1DAS的CT和HS柱,接着是15DAS的CT和HS柱,以此类推。 - 保持position_dodge参数:
position_dodge(width = 0.7)确保同一DAS组内的CT和HS柱紧密并列,不同DAS组之间有清晰间隔。
如果你的DAS是数字类型(比如1、15、30),可以用factor(data$DAS, levels = sort(unique(data$DAS)))自动生成有序因子。
内容的提问来源于stack exchange,提问作者Ikram Bashir
相关产品推荐
相关产品推荐

