如何在ggplot2突变棒棒糖图中添加分支分隔重叠元素
解决ggplot2突变棒棒糖图重叠分支问题
要解决相同氨基酸位置突变的堆叠问题,核心是给重叠的突变点添加水平偏移,并通过分段线段绘制分支,具体实现步骤如下:
1. 预处理数据,添加偏移量
首先用dplyr对相同AA位置的突变分配水平偏移值,确保每个点都有独立的x坐标:
library(dplyr) # 给相同AA的突变添加水平偏移 mut.df <- mut.df %>% group_by(AA) %>% mutate( # 统计每个AA位置的突变数量 mut_count = n(), # 根据突变数量分配偏移范围,可根据需求调整幅度(这里用±0.8) x_offset = AA + seq(-0.8, 0.8, length.out = mut_count) ) %>% ungroup()
2. 修改绘图代码,绘制分支线段
将原来的单条垂直棒棒糖线段拆分为水平分支和垂直线段两部分,同时把点和文本的x坐标替换为偏移后的x_offset:
library(ggplot2) library(ggrepel) str.fill <- "#E1E1E1" str.col <- "#16161D" dom.fill <- c("Dom2" = "#FF0000", "Dom1" = "#AA4BAB") dom.col <- c("#16161D") gp <- ggplot() + # 绘制结构背景 geom_rect(data = subset(domain.df, Type == "str"), mapping = aes(xmin = min(Start), xmax = max(End), ymin = 0.3, ymax = 0.7), fill = str.fill, colour = str.col) + # 绘制结构域 geom_rect(data = subset(domain.df, Type == "dom"), mapping = aes(xmin = Start, xmax = End, ymin = 0.2, ymax = 0.8, fill = Feature), fill = dom.fill[subset(domain.df, Type == "dom")$Feature], colour = dom.col) + # 绘制水平分支线段(从原始AA位置到偏移后的x) geom_segment(data = mut.df, aes(x = AA, xend = x_offset, y = 0.7, yend = 0.7), colour = "black") + # 绘制垂直棒棒糖线段(从分支末端到突变频率位置) geom_segment(data = mut.df, aes(x = x_offset, xend = x_offset, y = 0.7, yend = Freq), colour = "black") + # 绘制突变点(使用偏移后的x坐标) geom_point(data = mut.df, aes(x = x_offset, y = Freq, fill = Type), shape = 21, size = 2) + # 绘制突变标签(使用偏移后的x坐标) geom_text_repel(data = mut.df, aes(x = x_offset, y = Freq, label = Mut), bg.colour = "white", seed = 12345, nudge_y = 0.25) + # 坐标轴和主题设置 scale_y_continuous(limits = c(0, 10), breaks = 0:10) + theme_bw() + theme(panel.grid.minor = element_blank(), panel.grid.major.x = element_blank(), panel.grid.major.y = element_line(linetype = "dotted")) + labs(x = "AA", y = "Freq", fill = "Mutation") print(gp)
关键调整说明
- 偏移幅度:
seq(-0.8, 0.8, length.out = mut_count)中的±0.8可根据实际情况调整,如果突变数量更多,可适当扩大范围(比如±1.2),避免点重叠。 - 图层顺序:注意把结构域和背景的
geom_rect放在最底层,避免遮挡分支线段。
内容的提问来源于stack exchange,提问作者user22423300
相关产品推荐
相关产品推荐

