如何绘制含Jaccard指数数值的热图并展示亚型元素与得分?
解决Jaccard指数热图绘制问题
问题根源
你的原代码逻辑是正确的,但和在线工具的差异大概率来自可视化细节缺失(比如未显示Jaccard数值、未标注分组对应的元素集合、保留了聚类树),或是二分矩阵的构建未严格遵循集合逻辑(Jaccard基于元素存在/不存在,而非计数)。
测试数据优化方案
以下代码调整了可视化参数,同时确保Jaccard计算的严谨性,结果更贴近在线工具的展示效果:
library(vegan) library(pheatmap) # 测试数据 df <- data.frame(tumor_type = c("tumor1", "tumor1", "tumor1", "tumor2", "tumor2", "tumor3", "tumor4", "tumor4"), genes = c("geneA", "geneB", "geneC", "geneA", "geneD", "geneD", "geneA", "geneD")) # 构建严格的二分矩阵:行=tumor_type,列=genes,存在为1,不存在为0 binary_matrix <- table(df$tumor_type, df$genes) %>% as.matrix() binary_matrix[binary_matrix > 0] <- 1 # 转换为集合存在标记,忽略重复 # 计算Jaccard相似度(1 - Jaccard距离) jaccard_sim <- 1 - as.matrix(vegdist(binary_matrix, method = "jaccard")) # 准备行注释:展示每个肿瘤亚型对应的基因集合 annot_row <- data.frame(Genes = sapply(rownames(jaccard_sim), function(x) { paste(colnames(binary_matrix)[binary_matrix[x,] == 1], collapse = ", ") })) # 绘制热图,匹配在线工具的核心特征 pheatmap(jaccard_sim, annotation_row = annot_row, display_numbers = TRUE, # 显示单元格的Jaccard得分 number_format = "%.2f", main = "肿瘤亚型Jaccard相似度热图", treeheight_row = 0, treeheight_col = 0, # 关闭聚类树(若在线工具无此结构) cellwidth = 80, cellheight = 80)
实际GO Term数据处理方案
针对你提供的Comparison-GO Term数据集,按以下步骤绘制符合预期的热图:
library(vegan) library(pheatmap) # 实际数据子集 actual_df <- structure(list(Comparison = c("M0_vs_M1", "M0_vs_M1", "M0_vs_M1", "M0_vs_M1", "M0_vs_M1", "M0_vs_M1", "M4_vs_M5", "M4_vs_M5", "M4_vs_M5", "M4_vs_M5", "M4_vs_M5", "M4_vs_M5"), Term = c("GO:0042742", "GO:0009617", "GO:0006959", "GO:0006956", "GO:0006958", "GO:0002455", "GO:0048863", "GO:0048864", "GO:0001667", "GO:0048483", "GO:0051129", "GO:0010977" )), row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 3266L, 3267L, 3268L, 3269L, 3270L, 3271L), class = "data.frame") # 构建GO Term二分矩阵 binary_go_matrix <- table(actual_df$Comparison, actual_df$Term) %>% as.matrix() binary_go_matrix[binary_go_matrix > 0] <- 1 # 计算Jaccard相似度 jaccard_go_sim <- 1 - as.matrix(vegdist(binary_go_matrix, method = "jaccard")) # 准备行注释:换行展示每个Comparison的GO Term列表 annot_go_row <- data.frame(GO_Terms = sapply(rownames(jaccard_go_sim), function(x) { paste(colnames(binary_go_matrix)[binary_go_matrix[x,] == 1], collapse = "\n") })) # 绘制热图 pheatmap(jaccard_go_sim, annotation_row = annot_go_row, display_numbers = TRUE, number_format = "%.2f", main = "Comparison组GO Term Jaccard相似度热图", treeheight_row = 0, treeheight_col = 0, cellwidth = 100, cellheight = 100, fontsize_row = 10, fontsize_col = 10)
核心调整说明
- 二分矩阵修正:将计数转换为1,确保Jaccard计算基于元素集合的存在/不存在(符合Jaccard指数的定义)
- 数值显示:添加
display_numbers直接展示相似度数值,和在线工具对齐 - 注释增强:添加行注释展示每个分组对应的元素集合,让热图信息更直观
- 聚类控制:关闭聚类树(若在线工具无聚类结构),避免干扰核心信息展示
- 可视化优化:调整单元格大小、字体大小,提升可读性
内容的提问来源于stack exchange,提问作者PesKchan
相关产品推荐
相关产品推荐

