如何为heatmap.2生成的树状图分组设置不同颜色?
给heatmap.2树状图分组添加自定义颜色
要实现你的需求,我们可以通过侧边颜色条或者直接给树状图分支上色两种方式来完成,下面是具体的步骤和代码示例:
方法一:添加侧边颜色条(简单直观)
这种方式会在热图的行/列树状图旁添加一个颜色条,每个颜色对应你定义的分组,同时确保和树状图的聚类结果对应。
步骤1:准备分组与颜色映射
首先我们需要把矩阵的行/列名和你的分组对应起来,生成匹配顺序的颜色向量:
library(gplots) # 你的原始分组 group_list <- list( group1 = c("a","d"), group2 = c("b","c","e"), group3 = c("f","g") ) # 创建行名到分组的映射(如果是列分组,把rownames换成colnames) row_to_group <- unlist(lapply(names(group_list), function(g) rep(g, length(group_list[[g]])))) names(row_to_group) <- unlist(group_list) # 按矩阵行名排序,确保颜色顺序和矩阵行完全匹配 row_to_group <- row_to_group[rownames(mat)] # 给每个分组分配自定义颜色(可替换成你喜欢的颜色) group_colors <- c("group1" = "#1f77b4", "group2" = "#ff7f0e", "group3" = "#2ca02c") row_side_colors <- group_colors[row_to_group]
步骤2:绘制带侧边颜色的热图
调用heatmap.2时加入RowSideColors参数(列分组用ColSideColors):
heatmap.2(mat, Colv = TRUE, Rowv = TRUE, RowSideColors = row_side_colors, # 行分组颜色条 col = colorRampPalette(c("navy", "white", "firebrick3"))(100), # 热图主颜色 trace = "none", # 关闭默认的trace线,让图更整洁 margins = c(8, 8), # 调整边距避免标签被截断 main = "Heatmap with Grouped Colors" # 添加标题 )
方法二:给树状图分支直接上色(更直观展示聚类分组)
如果想让树状图的分支本身就显示对应分组的颜色,可以借助dendextend包来处理树状图:
步骤1:处理树状图并上色
library(gplots) library(dendextend) # 计算行聚类的树状图(列聚类同理) row_dend <- as.dendrogram(hclust(dist(mat))) # 给树状图分支按分组上色 row_dend_colored <- color_branches(row_dend, groups = row_to_group, col = group_colors)
步骤2:绘制带彩色分支的热图
把上色后的树状图传入heatmap.2的Rowv参数:
heatmap.2(mat, Colv = TRUE, Rowv = row_dend_colored, # 使用上色后的行树状图 RowSideColors = row_side_colors, # 可选:同时保留侧边颜色条,双重确认分组 col = colorRampPalette(c("navy", "white", "firebrick3"))(100), trace = "none", margins = c(8, 8) )
注意事项
- 一定要确保颜色向量的顺序和矩阵的行/列顺序完全一致,不然颜色会对应错误!
- 颜色可以自由替换,比如使用R内置颜色名(如
"red"、"green")或者十六进制颜色码。 - 如果你的分组是列分组,只需要把代码中的
row相关参数替换成col即可(比如ColSideColors、colnames(mat))。
内容的提问来源于stack exchange,提问作者user2026




