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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:07:44