This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Heatmap legend position change

Hello,

This is code that I am using to generate a heatmap:

color_fun <- colorRamp2(c(-4, 0, 4), c("red", "black", "green"))
df = read.csv("RAT7basedlog2version2.csv", header = T)
df$Cluster = factor(df$Cluster, levels =c(
  "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
  "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
  "21", "22", "23", "24", "25", "26", "27", "28", "29", "30",
  "31", "32", "33", "34", "35", "36", "37", "38", "39", "40",
  "41", "42"
))


heat = as.matrix(df[, c("RAT7", "PTR7")])
rownames(heat) <- paste0(df$geneid)
ColAnn = data.frame(colnames(heat))
colnames(ColAnn) = c("Sample")
ColAnn = HeatmapAnnotation(df = ColAnn, which = "col")
RowAnn = data.frame(df$Cluster)
colnames(RowAnn) = ("Cluster")

colours = list("Cluster" = color_codes <- c(
  "1" = "#FF0000",   "2" = "#00FF00",   "3" = "#0000FF",   "4" = "#FFA500",
  "5" = "#FF00FF",   "6" = "#00FFFF",   "7" = "#800080",   "8" = "#008000",
  "9" = "#FF4500",   "10" = "#32CD32",  "11" = "#9400D3",  "12" = "#FF1493",
  "13" = "#8A2BE2",  "14" = "#FF69B4",  "15" = "#FF6347",  "16" = "#1E90FF",
  "17" = "#FFD700",  "18" = "#00CED1",  "19" = "#DC143C",  "20" = "#ADFF2F",
  "21" = "#FF8C00",  "22" = "#8B008B",  "23" = "#7FFF00",  "24" = "#4B0082",
  "25" = "#00FF7F",  "26" = "#FF4500",  "27" = "#800000",  "28" = "#808000",
  "29" = "#000080",  "30" = "#008080",  "31" = "#FFDAB9",  "32" = "#CD853F",
  "33" = "#FFC0CB",  "34" = "#BC8F8F",  "35" = "#FF7F50",  "36" = "#F08080",
  "37" = "#20B2AA",  "38" = "#7FFFD4",  "39" = "#DDA0DD",  "40" = "#87CEFA",
  "41" = "#FF6347",  "42" = "#1E90FF"
))

RowAnn = HeatmapAnnotation(df = RowAnn, col = colours, which = "row", show_annotation_name = F, simple_anno_size = unit(0.5, "cm"), annotation_height = unit(1, "cm"))


split = c(rep("A:1-992", 992), rep("B:993-1231", 239))

lgd = Legend(col_fun = color_fun, title = "Log2FC", direction = "horizontal")
lgd
hmap = Heatmap(heat,
               name = "Log2FC",
               col = color_fun,
               show_heatmap_legend = T,
               split = df$Cluster,
               cluster_columns = F,
               cluster_row_slices = F,
               cluster_rows = F,
               show_row_dend = F,
               show_row_names = F,
               show_column_names = F,
               show_column_dend = F,
               row_title_side = "left",
               row_title = NULL,
               row_title_gp = gpar(fontsize = 12, fontface = "bold"),
               row_names_side = "left",
               row_title_rot = 0,
               width = unit(4, "cm"),
               row_split = split,
               right_annotation = rowAnnotation(foo = anno_block(labels = c("", ""), width = unit(2, "cm"))))
draw(hmap+RowAnn, heatmap_legend_side = "left", annotation_legend_side = "right")

enter image description here

And, How can I move the legend that are makred as red box to above Cluster legend?; probably, I need to reduce the size of "Cluster" legend

complexheatmap

RTFM is a good response but does not warrant being an answer, so I've moved it to a comment. OP definitely needs to read the freaking manual though.

I need to reduce the size of "Cluster" legend

Your legend should not have 42 possible values, that is not a legend. Unless you're explaining each cluster in detail somewhere (which I highly doubt), add a proper annotation to just the cluster(s) of interest and remove the cluster row annotation altogether. Even if you wanted to retain all cluster numbers, add them to the row annotation so the annotation is not just a colored block but a colored block with some text in it.

1 answer

You can change show_heatmap_legend = F in your hmap = Heatmap(.......) section and plot legend separately.

draw(hmap+RowAnn, heatmap_legend_side = "left", annotation_legend_side = "right")
draw(lgd, x = unit(1, "cm"), y = unit(17.2, "cm")) ##you need to play with x = unit(1, "cm"), y = unit(17.2, "cm") section to position your legend where you wanted

Here is the demo how I ll do-

color_fun <- colorRamp2(c(-4, 0, 4), c("red", "black", "green"))
lgd = Legend(col_fun = color_fun, title = "Log2FC")

hmap <- Heatmap(matrix(rnorm(100), 10), show_heatmap_legend = F,col = color_fun,
    cluster_rows = F, cluster_columns = F,width = ncol(mat)*unit(20, "mm"), 
    height = nrow(mat)*unit(13, "mm"))
draw(hmap)
draw(lgd, x = unit(1, "cm"), y = unit(17.2, "cm"))

enter image description here

Log in to answer this question.