如何拆分热图?基于ComplexHeatmap包的技术问询
如何拆分ComplexHeatmap绘制的热图
先梳理下你的数据与代码背景:
你拥有如下数据框Screening:
Screening <- data.frame( Name = c("Z.", "X.", "C."), Q = c(4, 1, 2), E = c(2, 3, 5), R = c(4, 1, 6) )
对应的预处理代码:
library(ComplexHeatmap) library(circlize) rnames <- Screening[,1] mat_data <- data.matrix(Screening[,3:ncol(Screening)]) rownames(mat_data) <- rnames mat2 = mat_data mat2[1, 1] = 100000
针对「拆分热图」的需求,结合ComplexHeatmap的特性,我整理了几种常见场景的实现方案:
1. 按行/列分块拆分热图
如果希望把热图按行或列拆分成关联的子热图块,可以使用split参数指定分组规则:
按行拆分示例
比如将第一行单独作为一组,后两行作为另一组:
# 定义行分组规则 row_groups <- c("Extreme_Group", "Normal_Group", "Normal_Group") Heatmap(mat2, col = colorRamp2(c(6, 3, 1, 0), c("red", "orange", "yellow", "#a6e8ed")), cluster_rows = FALSE, cluster_columns = FALSE, heatmap_legend_param = list(title = "Intensity"), split = row_groups) # 传入分组实现行拆分
按列拆分示例
同理,若要按列拆分,使用column_split参数:
# 定义列分组规则 col_groups <- c("Col_Group1", "Col_Group2") Heatmap(mat2, col = colorRamp2(c(6, 3, 1, 0), c("red", "orange", "yellow", "#a6e8ed")), cluster_rows = FALSE, cluster_columns = FALSE, heatmap_legend_param = list(title = "Intensity"), column_split = col_groups) # 传入分组实现列拆分
2. 拆分为完全独立的热图对象后拼接
如果需要把热图拆成完全独立的部分,分别定制后再拼接展示,可以创建多个Heatmap对象,最后合并绘制:
# 拆分原始矩阵为两个子矩阵 mat_extreme <- mat2[1,, drop = FALSE] mat_normal <- mat2[2:3,, drop = FALSE] # 创建两个独立的热图对象 ht_extreme <- Heatmap(mat_extreme, col = colorRamp2(c(0, 100000), c("#a6e8ed", "darkred")), cluster_rows = FALSE, cluster_columns = FALSE, heatmap_legend_param = list(title = "Extreme_Intensity")) ht_normal <- Heatmap(mat_normal, col = colorRamp2(c(6, 3, 1, 0), c("red", "orange", "yellow", "#a6e8ed")), cluster_rows = FALSE, cluster_columns = FALSE, heatmap_legend_param = list(title = "Normal_Intensity")) # 拼接并绘制,可选合并图例 draw(ht_extreme + ht_normal, merge_legends = TRUE)
3. 针对极端值的拆分优化
注意到你将mat2[1,1]设为了100000,这个极端值会导致整体颜色映射失真。如果拆分热图是为了单独展示该极端区域,建议单独为其设置颜色映射,再拆分显示:
# 定制包含极端值的颜色映射 col_custom <- colorRamp2(c(0, 1, 3, 6, 100000), c("#a6e8ed", "yellow", "orange", "red", "darkred")) Heatmap(mat2, col = col_custom, cluster_rows = FALSE, cluster_columns = FALSE, heatmap_legend_param = list(title = "Intensity"), split = c("Extreme_Row", "Normal_Row", "Normal_Row"))
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

