咨询:能否用ggplot2绘制连锁不平衡(Linkage disequilibrium)图
用ggplot2绘制连锁不平衡(LD)图表的实现方案
完全可以用ggplot2绘制你需要的连锁不平衡(LD)图表,这类图表通常通过色块和数值标注展示SNP间的LD关联强度(如D'或r²值),能完美匹配你参考的示例样式。
实现步骤
- 安装依赖包:需要用到
ggplot2做可视化,LDheatmap或genetics计算LD值
install.packages(c("ggplot2", "LDheatmap", "genetics")) library(ggplot2) library(LDheatmap) library(genetics)
- 准备并处理数据
以内置基因型数据为例,先计算LD(D')值,再整理为ggplot兼容的长格式:
# 加载示例基因型数据 data(genotypes) # 计算LD值(不直接绘图,仅提取数据) ld_result <- LDheatmap(genotypes, LDmeasure = "D'", plot = FALSE) # 转换LD矩阵为长格式数据框 ld_df <- as.data.frame(as.table(ld_result$LDmatrix)) colnames(ld_df) <- c("SNP1", "SNP2", "D_prime") # 保留上三角区域(含对角线),对应示例的展示形式 ld_df <- ld_df[as.numeric(ld_df$SNP1) <= as.numeric(ld_df$SNP2), ]
- 绘制LD图
自定义样式匹配示例的色块+数值标注效果:
ggplot(ld_df, aes(x = SNP1, y = SNP2, fill = D_prime)) + geom_tile(color = "white") + # 添加D'值标注 geom_text(aes(label = round(D_prime, 2)), size = 3, color = "black") + # 设置蓝-红渐变配色,匹配参考示例 scale_fill_gradient(low = "blue", high = "red", limits = c(0, 1)) + # 保持SNP位点顺序一致 scale_x_discrete(limits = rownames(ld_result$LDmatrix)) + scale_y_discrete(limits = rev(colnames(ld_result$LDmatrix))) + labs(title = "连锁不平衡(LD)图谱", x = "SNP位点", y = "SNP位点", fill = "D'值") + theme_minimal() + theme( axis.text.x = element_text(angle = 45, hjust = 1), plot.title = element_text(hjust = 0.5) )
自定义调整
你可以根据实际需求修改:
- 替换
LDmeasure = "r2"来绘制基于r²的LD图 - 调整
scale_fill_gradient的配色方案 - 修改
geom_text的大小、颜色来优化标注可读性 - 加入SNP的物理距离信息,在坐标轴下方标注位置
内容的提问来源于stack exchange,提问作者Mateus Piza
相关产品推荐
相关产品推荐

