Decorations on heatmaps

Zuguang Gu ( z.gu@dkfz.de )

2024-10-29

In ComplexHeatmap, functions decorate_*() (e.g. decorate_annotation()) are used to add graphics after the heatmaps are drawn. To also put the decoration graphics in heatmaps in the Shiny app, user needs to wrap all the decoration code into a function and send it with post_fun argument to draw() function. For example, the following code generates a decorated heatmap:

library(ComplexHeatmap)
m = matrix(rnorm(100), 10)
ht = Heatmap(m, name = "foo")
ht = draw(ht)
decorate_heatmap_body("foo", {
    grid.text("some text", gp = gpar(fontsize = 30))
})

To export it as a Shiny app also with decorations, the code needs to be slightly adjusted to:

library(InteractiveComplexHeatmap)
post_fun = function(ht_list) {
    decorate_heatmap_body("foo", {
        grid.text("some text", gp = gpar(fontsize = 30))
    })
}
ht = draw(ht, post_fun = post_fun)
htShiny(ht)

post_fun is a self-defined function and always needs one argument ht_list. Since post_fun is applied after the heatmaps are drawn, ht_list used in post_fun actually contains the clustering results (if they are applied). Thus, you can do something like follows in post_fun:

post_fun = function(ht_list) {
    decorate_heatmap_body("foo", {
        row_dend(ht_list)
        row_order(ht_list)
        ...
    })
}

Note the decorations will not be applied on the sub-heatmap, so you will not see the decoration graphics there.