ComplexHeatmap:如何以不同方式放置热图图例和注释图例?

ComplexHeatmap: How to place heatmap legend and annotation legend differently?

我用library(ComplexHeatmap)

制作了这个情节

我想要 Z-score 在底部位置,而分类变量显示在右侧。 接近了,但是我无法像下面的脚本那样使用 rowAnnotation 让它工作。

预期输出

有了这些数据:

set.seed(123)
library(ComplexHeatmap)
mat = matrix(rnorm(96, 2), 8, 12)
mat = rbind(mat, matrix(rnorm(48, -2), 4, 12))
hmap <- as.data.frame(t(mat))

hmap$type <- rep(c("Ctrl", "Cell_type1", "Cell_type2"), 4)
hmap$malig <- ifelse(hmap$type == "Ctrl", "Ctrl", "Tumor")

hmap_bt <- scale(as.matrix(hmap[, -c(13:14)]))

并使用此脚本

draw(Heatmap(hmap_bt, 
             name = "Z-score",    
             col = colorRamp2(c(-2, 0, 2), c("#6DBCC3", "white", "#8B3A62")),

             show_column_names = FALSE,
             show_column_dend = FALSE,
             column_km = 3,
             
             left_annotation = rowAnnotation(Case = hmap[, c(13:14)]$malig,
                                             Type = hmap[, c(13:14)]$type,
                                             col = list(Case = c("Ctrl" = "#D1B551", "Tumor" = "#678F53"),
                                                        Type = c("Ctrl" = "#D1B551", "Cell_type1" = "green", "Cell_type2" = "blue")),
                                             annotation_legend_param = list(
                                               Case = list( 
                                                 title_gp = gpar(fontsize = 16, 
                                                                 fontface = "bold"), 
                                                 labels_gp = gpar(fontsize = 16)),
                                               Type = list( 
                                                 title_gp = gpar(fontsize = 16,
                                                                 fontface = "bold"), 
                                                 labels_gp = gpar(fontsize = 16)))),
             heatmap_legend_param = list(
               legend_direction = "horizontal", 
               legend_width = unit(6, "cm")), 
    ),

  heatmap_legend_side = "bottom"
)

尝试使用 draw 命令的选项 legend_grouping = "original"

library(ComplexHeatmap)
library(circlize)

set.seed(123)
mat = matrix(rnorm(96, 2), 8, 12)
mat = rbind(mat, matrix(rnorm(48, -2), 4, 12))
hmap <- as.data.frame(t(mat))

hmap$type <- rep(c("Ctrl", "Cell_type1", "Cell_type2"), 4)
hmap$malig <- ifelse(hmap$type == "Ctrl", "Ctrl", "Tumor")

hmap_bt <- scale(as.matrix(hmap[, -c(13:14)]))
And using this script

df <- data.frame(Case = hmap[, c(13:14)]$malig,
                 Type = hmap[, c(13:14)]$type)

annot <-  rowAnnotation(
  df = data.frame(Case = hmap[, c(13:14)]$malig,
                  Type = hmap[, c(13:14)]$type),
  col = list(Case = c("Ctrl" = "#D1B551", "Tumor" = "#678F53"),
             Type = c("Ctrl" = "#D1B551", "Cell_type1" = "green", 
                      "Cell_type2" = "blue")),
  annotation_legend_param = list(
    Case = list( 
      title_gp = gpar(fontsize = 16, 
                      fontface = "bold"), 
      labels_gp = gpar(fontsize = 16)),
    Type = list( 
      title_gp = gpar(fontsize = 16,
                      fontface = "bold"), 
      labels_gp = gpar(fontsize = 16)))
)

htmp <- Heatmap(
  hmap_bt, 
  name = "Z-score",    
  col = colorRamp2(c(-2, 0, 2), c("#6DBCC3", "white", "#8B3A62")),
  
  show_column_names = FALSE,
  show_column_dend = FALSE,
  column_km = 3,
  
  left_annotation = annot,
  heatmap_legend_param = list(
    legend_direction = "horizontal", 
    legend_width = unit(6, "cm")), 
)

draw(htmp, heatmap_legend_side="bottom", annotation_legend_side="right",
           legend_grouping = "original")