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

如何生成23andme风格的IBD家系分析ggplot图谱?

用ggplot绘制23andMe风格的IBD家系图谱

数据预处理与准备

先将现有数据转换为ggplot可直接使用的格式,核心是为所有染色体生成轮廓数据(即使无IBD数据),同时完成IBD区块和着丝粒的坐标映射:

library(dplyr)
library(ggplot2)

# 1. 生成所有染色体的轮廓数据框
chrom_plot <- chrom_sizes %>%
  # 按1-22号染色体排序
  mutate(chrom = factor(chrom, levels = paste0("chr", 1:22)),
         # 为每个染色体分配y轴位置(每行对应一条染色体)
         y = row_number(),
         start = 0,
         end = size)

# 2. 处理着丝粒数据,匹配染色体y轴位置
cent_plot <- centromeres %>%
  filter(chrom %in% paste0("chr", 1:22)) %>%
  mutate(chrom = factor(chrom, levels = paste0("chr", 1:22)),
         y = match(chrom, paste0("chr", 1:22)))

# 3. 转换IBD数据(假设IBD对象包含chrom、start、end、sample1、sample2、ibd_type字段)
ibd_plot <- IBD %>%
  mutate(chrom = factor(chrom, levels = paste0("chr", 1:22)),
         y = match(chrom, paste0("chr", 1:22))) %>%
  # 同一染色体下,不同家系成员对的区块分配子y轴位置,避免重叠
  group_by(chrom) %>%
  mutate(sub_y = y + (row_number() - 1)/5) %>%
  ungroup()

绘制基础图层(染色体轮廓+着丝粒)

先绘制所有染色体的空白轮廓和着丝粒标记,确保无数据的染色体也能显示框架:

p <- ggplot() +
  # 染色体轮廓:白色填充+黑色边框
  geom_rect(data = chrom_plot,
            aes(xmin = start, xmax = end, ymin = y - 0.4, ymax = y + 0.4),
            fill = "white", color = "black", size = 0.5) +
  # 着丝粒:灰色粗线段标记
  geom_segment(data = cent_plot,
               aes(x = start, xend = end, y = y - 0.4, yend = y + 0.4),
               color = "gray50", size = 1.5) +
  # 坐标轴设置
  scale_y_continuous(breaks = chrom_plot$y, labels = chrom_plot$chrom) +
  scale_x_continuous(expand = c(0, 0), name = "染色体位置 (bp)") +
  labs(y = "染色体") +
  # 主题调整:去除网格,简化样式
  theme_minimal() +
  theme(panel.grid = element_blank(),
        axis.text.y = element_text(size = 8),
        axis.title = element_text(size = 10))

叠加IBD区块

将20号染色体的IBD区块按家系成员对分别绘制,并添加类型区分:

p <- p +
  # IBD区块:按类型填充颜色,黑色细边框
  geom_rect(data = ibd_plot,
            aes(xmin = start, xmax = end, ymin = sub_y - 0.15, ymax = sub_y + 0.15,
                fill = ibd_type),
            color = "black", size = 0.2) +
  # 自定义IBD类型颜色(IBD1为蓝色,IBD2为红色)
  scale_fill_manual(values = c("IBD1" = "#3399FF", "IBD2" = "#FF3333"), name = "IBD类型") +
  # 添加家系成员对标签
  geom_text(data = ibd_plot,
            aes(x = (start + end)/2, y = sub_y, label = paste(sample1, sample2, sep = "-")),
            size = 3, vjust = 1.5)

最终样式调整

优化布局和细节,让图谱更贴近23andMe风格:

p <- p +
  coord_cartesian(clip = "off") +
  theme(legend.position = "top",
        plot.margin = margin(10, 10, 10, 10))

# 输出图谱
print(p)

关键说明

  • 所有染色体的轮廓由chrom_plot数据生成,即使无IBD数据的染色体也会显示空白框架
  • 子y轴位置sub_y的间距可根据家系成员对的数量灵活调整(修改/5的数值)
  • 若IBD数据字段与示例不同,需对应调整ibd_plot中的字段映射

内容的提问来源于stack exchange,提问作者mugdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:40:20