如何用ggplot2+ggbreak绘制带Y轴断裂的基因曼哈顿图
解决qqman曼哈顿图Y轴断裂+保持原生样式的方法
核心思路
利用qqman预处理好的绘图数据(避免X轴排序混乱),结合ggbreak实现Y轴断裂,同时还原qqman的经典样式。
步骤1:提取qqman预处理的数据
qqman的manhattan()函数可以返回处理好的绘图数据集(包含按染色体顺序排列的因子化CHR列,直接解决X轴排序问题):
library(qqman) library(ggbreak) library(ggplot2) # 假设你的全基因组数据为gwas_data,需包含SNP、CHR、BP、P列 # 仅获取预处理数据,不直接绘图 p <- manhattan(gwas_data, plot = FALSE) plot_data <- p$data
步骤2:绘制带Y轴断裂的曼哈顿图
基于提取的plot_data,用ggbreak实现Y轴双断裂(8-149、149-300),同时还原qqman的样式细节:
ggplot(plot_data, aes(x = CHR, y = -log10(P), color = as.factor(CHR))) + # 绘制散点,匹配qqman点大小 geom_point(size = 1.2) + # 设置Y轴断裂:断裂位置为8和149,分三段显示0-8、149-300 scale_y_break(c(8, 149), scales = c(0, 8, 149, 300), space = 0.1) + # 还原qqman的染色体交替配色 scale_color_manual(values = rep(c("black", "gray"), 22)) + # 添加qqman默认的阈值线:建议阈值(-log10(1e-6)=6,蓝色虚线)、显著阈值(-log10(5e-8)=7.3,红色实线) geom_hline(yintercept = c(6, 7.3), linetype = c("dashed", "solid"), color = c("blue", "red")) + # 设置X轴标签:仅显示偶数染色体,匹配qqman默认逻辑 scale_x_discrete(breaks = unique(plot_data$CHR)[seq(2, length(unique(plot_data$CHR)), 2)], labels = unique(plot_data$CHR)[seq(2, length(unique(plot_data$CHR)), 2)]) + # 还原qqman的简洁主题 theme_bw() + theme( legend.position = "none", panel.grid.major.x = element_blank(), axis.title.x = element_text("Chromosome"), axis.title.y = element_text("-log10(P)") )
关键细节说明
- X轴排序问题:
plot_data中的CHR是qqman预先处理好的有序因子,直接使用即可避免手动排序错误。 - Y轴断裂调整:
scale_y_break的space参数可控制断裂处的空白宽度,scales参数可自定义各分段的Y轴范围。 - 样式还原:通过
scale_color_manual、geom_hline和主题设置,完全对齐qqman的原生视觉效果。
内容的提问来源于stack exchange,提问作者tacrolimus
相关产品推荐
相关产品推荐

