R语言pheatmap绘图报错:下标越界问题求助
排查并解决pheatmap的"下标越界"报错
我帮你拆解下这个报错的来龙去脉,以及对应的解决办法:
核心问题分析
这个下标越界错误本质是pheatmap找不到你指定的注释与颜色映射的对应关系,大概率是以下两个问题中的一个:
- 你创建行注释
annotation_row时格式错误,导致列名或分类值不符合要求 ann_colors里的癌症类型颜色映射没有覆盖你的数据中实际存在的所有类型
分步解决步骤
1. 修复annotation_row的创建逻辑
你的代码里labels <- another[4]取的是整个第4列的data.frame对象,而不是列对应的向量,把它转成factor会导致注释格式混乱。改成下面的代码:
# 取第4列的向量而不是data.frame,这是关键修正 labels <- another[[4]] # 基于向量创建行注释,确保格式正确 annotation_row <- data.frame(CancerType = factor(labels))
2. 检查颜色映射的完整性
你定义的ann_colors$CancerType里有很多癌症类型,但要确保你的labels里的所有类型都在这个映射里。可以用下面的代码快速检查:
# 查看数据中实际存在的癌症类型 unique(labels) # 查看你定义的颜色映射包含的类型 names(ann_colors$CancerType) # 找出不在映射里的类型(如果有输出就是漏了的) setdiff(unique(labels), names(ann_colors$CancerType))
如果输出有结果,说明你漏了对应类型的颜色,把这些类型补充到ann_colors$CancerType里即可,比如漏了XXX就加XXX="#XXXXXX"。
3. 验证注释与颜色映射的匹配性
最后可以打印下两个对象的结构,确认列名一致(都是CancerType):
colnames(annotation_row) names(ann_colors)
只要两者都包含CancerType,且所有注释值都有对应的颜色,报错就会消失。
修正后的完整代码示例
library(pheatmap) another <- read.table("~/Desktop/tcga3dcategorized.csv", sep=',', header=FALSE) test <- another[1:3] # 修正:取第4列的向量 labels <- another[[4]] colnames(test) = c("Dim 1","Dim 2","Dim 3") annotation_row <- data.frame(CancerType = factor(labels)) ann_colors = list(CancerType=c(KIRC="red", UCEC="#B2509E",LUSC="#D49DC7", LGG="#C1A72F",PCPG="#E8C51D",HNSC="#F9ED32",CESC="#104A7F",ESCA="#9EDDF9", BRCA="#007EB5",THCA="#CACCDB",PRAD="#6E7BA2",MESO="#DAF1FC",PAAD="#00AEEF", LUAD="#F6B667",LAML="#D97D25",UVM="#FBE3C7",GBM="#F89420",READ="#97D1A9", SKCM="#009444",KIRP="#754C29",COAD="#CEAC8F",LIHC="#3953A4",SARC="#BBD642", OV="#00A99D",BLCA="#D3C3E0",STAD="#A084BD",TGCT="#542C88",ACC="#FAD2D9", THYM="#ED1C24",KICH="#F8AFB3",DLBC="#EA7075",UCS="#7E1918",CHOL="#BE1E2D")) # 可选:先检查是否有未映射的类型,提前预警 if(length(setdiff(unique(labels), names(ann_colors$CancerType)))>0){ warning("存在未映射的癌症类型,请补充颜色!") } pheatmap(test, annotation_row=annotation_row, annotation_colors=ann_colors, main="title")
内容的提问来源于stack exchange,提问作者Greenhand001
相关产品推荐
相关产品推荐

