如何生成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
相关产品推荐
相关产品推荐

