ggplot2绘制正负值柱状图缺失Post-Oviposition列及优化求助
问题原因说明
Post-Oviposition正值柱缺失是因为你设置的y轴上限为4000,该分组的上调DEG数量为4210,超出绘图范围被直接裁剪,调整y轴上限即可解决。
完整解决代码
先加载依赖包:
library(ggplot2) library(ggnewscale)
数据预处理(优化版,无需拆分处理两个表)
# 统一处理数值正负,合并数据也可以,分开绘图逻辑更清晰 up.counts$degs <- abs(up.counts$degs) dn.counts$degs <- -abs(dn.counts$degs) # 统一设置分组因子顺序,保证对应关系正确 contrast_levels <- unique(up.counts$contrast.names) up.counts$contrast.names <- factor(up.counts$contrast.names, levels = contrast_levels) dn.counts$contrast.names <- factor(dn.counts$contrast.names, levels = contrast_levels)
绘图代码(包含分组、自定义颜色需求)
# 自定义颜色,可根据需求替换色值 up_colors <- c("Early" = "#f8766d", "Late" = "#c73c26", "Both" = "#ff9d2e") # 上调组对应颜色 dn_colors <- c("Early" = "#619cff", "Late" = "#2363d1", "Both" = "#00ba38") # 下调组对应颜色 # 定义y轴刻度 ybreaks <- seq(-5000, 4500, 1000) cdeg1 <- ggplot() + # 上调分组柱形,position_dodge实现同x分组下按deg.phase并排展示 geom_bar(data = up.counts, aes(x = contrast.names, y = degs, fill = deg.phase), stat = "identity", width = 0.7, position = position_dodge(width = 0.8)) + scale_fill_manual(values = up_colors, name = "上调DEG") + # 重置填充色标尺,给下调组单独设置颜色 new_scale_fill() + # 下调分组柱形 geom_bar(data = dn.counts, aes(x = contrast.names, y = degs, fill = deg.phase), stat = "identity", width = 0.7, position = position_dodge(width = 0.8)) + scale_fill_manual(values = dn_colors, name = "下调DEG") + # 调整y轴上限到4500,避免最大值被截断 scale_y_continuous(limits = c(-5000,4500), breaks = ybreaks, labels = abs(ybreaks)) + # 基础标注与主题设置 labs(x = "分组名称", y = "差异基因数量") + theme_bw() + theme( legend.box = "horizontal", legend.margin = margin(0,0,0,-0.6, "cm"), legend.box.margin = margin(0,1,0,1, "cm"), legend.title = element_text(size = 14), legend.text = element_text(size = 12), axis.text.x = element_text(angle = 45, hjust = 1) # 倾斜x轴标签避免重叠 ) cdeg1
实现效果说明
- 调整y轴上限后Post-Oviposition的上调柱可完整显示
- 通过
position_dodge参数实现了同一个对比分组下,不同deg.phase的柱形并排的分组效果 - 上下调分组的deg.phase类别分别支持自定义颜色,直接修改
up_colors和dn_colors的色值即可适配需求
内容的提问来源于stack exchange,提问作者Patrick Thomas
相关产品推荐
相关产品推荐

