You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分热图?基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:55:26