如何用R语言程序化组装对齐的X、Y及相关矩阵热图?
解决方案:用ComplexHeatmap实现多热图精准对齐布局
要实现X、COR、Y三个热图的对齐组装,且独立控制每个热图的参数,可通过ComplexHeatmap的自定义布局与对齐功能完成,具体步骤如下:
核心思路
通过布局矩阵指定三个热图的位置:
- 转置后的X热图位于左上区域
- COR相关矩阵热图位于右上区域(与X的行对齐,对应X变量)
- Y热图位于左下区域(与X的列对齐对应样本,与COR的列对齐对应Y变量)
- 右下区域留空
完整代码
set.seed(1) X <- matrix(rnorm(3*6), nrow = 6, dimnames = list(samples = LETTERS[1:6], xvar = paste0("X", 1:3))) Y <- matrix(rnorm(4*6), nrow = 6, dimnames = list(samples = LETTERS[1:6], yvar = paste0("Y", 1:4))) COR <- cor(X,Y) library(ComplexHeatmap) # 独立定义每个热图,可自行设置颜色、标签等参数 h_X <- Heatmap(t(X), row_names_side = "left", cluster_rows = FALSE, cluster_columns = FALSE, name = "X", # 热图图例名称 col = colorRamp2(c(-2, 0, 2), c("#2c7fb8", "#ffffff", "#d95f02"))) # 自定义X的颜色映射 h_COR <- Heatmap(COR, column_names_side = "top", cluster_rows = FALSE, cluster_columns = FALSE, name = "Correlation", col = colorRamp2(c(-1, 0, 1), c("#67a9cf", "#f7f7f7", "#ef8a62"))) # 自定义相关矩阵的颜色映射 h_Y <- Heatmap(Y, cluster_rows = FALSE, cluster_columns = FALSE, name = "Y", col = colorRamp2(c(-2, 0, 2), c("#7570b3", "#ffffff", "#e7298a"))) # 自定义Y的颜色映射 # 定义布局矩阵:2行2列,1=X,2=COR,3=Y,0=空白区域 layout_matrix <- matrix(c(1, 2, 3, 0), nrow = 2, ncol = 2, byrow = TRUE) # 绘制组合热图并设置对齐规则 draw(h_X + h_COR + h_Y, layout_matrix = layout_matrix, # 指定对齐关系: align_heatmap_ht_list = list( c(1, 2), # X的行与COR的行对齐(X变量) c(1, 3), # X的列与Y的行对齐(样本) c(2, 3) # COR的列与Y的列对齐(Y变量) ), heatmap_legend_side = "right") # 图例统一放在右侧
关键说明
- 每个热图可独立设置
col(颜色映射)、name(图例名称)、row_names_side(行标签位置)等参数,完全满足自定义需求 layout_matrix通过数字标记热图位置,0代表空白区域align_heatmap_ht_list参数精准控制不同热图之间的行/列对齐,保证样本、变量的对应关系准确
其他包替代方案(pheatmap)
如果使用pheatmap,可通过grid包手动布局,但灵活性不如ComplexHeatmap:
library(pheatmap) library(grid) # 生成单个热图对象 p_X <- pheatmap(t(X), cluster_rows = FALSE, cluster_cols = FALSE, silent = TRUE) p_COR <- pheatmap(COR, cluster_rows = FALSE, cluster_cols = FALSE, silent = TRUE) p_Y <- pheatmap(Y, cluster_rows = FALSE, cluster_cols = FALSE, silent = TRUE) # 打开新绘图设备 grid.newpage() # 定义视口布局 pushViewport(viewport(layout = grid.layout(2, 2, widths = unit(c(3,2), "null"), heights = unit(c(2,3), "null")))) # 将每个热图放入对应视口 pushViewport(viewport(layout.pos.row = 1, layout.pos.col = 1)) grid.draw(p_X$gtable) popViewport() pushViewport(viewport(layout.pos.row = 1, layout.pos.col = 2)) grid.draw(p_COR$gtable) popViewport() pushViewport(viewport(layout.pos.row = 2, layout.pos.col = 1)) grid.draw(p_Y$gtable) popViewport()
注:pheatmap的手动布局需要自行调整视口的宽高比例,对齐精度略逊于ComplexHeatmap。
内容的提问来源于stack exchange,提问作者Alexlok
相关产品推荐
相关产品推荐

