二进制蛋白质组数据heatmap绘制及两类聚类问题求助
二进制蛋白质组数据热图修正与聚类实现
问题背景
使用0(未检测到蛋白)、1(检测到蛋白)的二进制质谱蛋白质组数据绘制热图,期望呈现0-1对应的双色效果,并将蛋白按检测率分为两类聚类,但默认绘制的热图呈现多色,不符合预期。
错误原因
R基础包的heatmap()函数默认会对行数据进行z-score标准化,将原始的0/1二进制值转换为连续的标准化数值,导致热图出现多色渐变,而非保留原始的二进制颜色映射。
修正方案与聚类实现
1. 基础热图修正(保留二进制双色)
通过关闭行标准化、指定双色映射,即可得到符合预期的0-1热图:
# 构造数据 data = data.frame (a = c(0,0,0,1,0,1,0,1), b = c(1,1,1,0,0,0,0,1), c = c(0,1,0,1,1,0,1,0), d = c(1,1,0,1,0,0,0,1)) # 转换为矩阵并设置行列名 data_matrix = as.matrix(data) row.names(data_matrix) = c("Protein_1", "Protein_2", "Protein_3", "Protein_4","Protein_5","Protein_6","Protein_7","Protein_8") colnames(data_matrix) = c("Patient_1","Patient_2","Patient_3","Patient_4") # 绘制修正后的二进制热图 heatmap(data_matrix, scale = "none", # 核心:关闭行标准化 col = c("white", "darkblue"), # 0对应白色,1对应深蓝色 main = "Binary Proteomic Heatmap", xlab = "Patients", ylab = "Proteins")
2. 实现蛋白两类聚类与分组展示
通过计算蛋白的阳性检测率(样本中检测到的比例),设定阈值划分两类,再结合pheatmap包实现带分组注释的聚类热图(比基础热图更直观):
# 安装并加载pheatmap(首次使用需安装) # install.packages("pheatmap") library(pheatmap) # 计算每个蛋白的阳性检测率 protein_pos_rate = rowMeans(data_matrix) # 按阈值(示例为0.5)划分两类:高检测率/低检测率 protein_groups = ifelse(protein_pos_rate >= 0.5, "High Detection", "Low Detection") # 构建行注释数据框 annotation_row = data.frame(Group = protein_groups) rownames(annotation_row) = rownames(data_matrix) # 绘制带分组注释的聚类热图 pheatmap(data_matrix, scale = "none", color = c("white", "darkblue"), annotation_row = annotation_row, # 添加蛋白分组注释 main = "Binary Proteomic Heatmap with Protein Clusters", show_rownames = TRUE, show_colnames = TRUE)
说明
- 若需调整聚类方式,可在
heatmap()或pheatmap()中通过hclustfun参数指定聚类算法; - 阳性检测率的阈值可根据实际数据调整,比如改为0.3或0.6,适配你的"检测到的蛋白过少"的判定标准。
内容的提问来源于stack exchange,提问作者Maciej
相关产品推荐
相关产品推荐

