I would like to highlight certain cells in the matrix by changing their transparency (i.e. all cells where highlight_matrix
are TRUE
should have an opacity/alpha of 0 and be solid colored, while FALSE
should be semi-transparent.
# Starting Matrix
mat <- matrix(runif(25), nrow = 5, ncol = 5)
#Matix showing which cells to highlight
highlight_matrix <- matrix(sample(c(TRUE, FALSE), 25, replace = TRUE), nrow = 5)
#Colors
my_colors <- circlize::colorRamp2(c(0,1), c("#440154", "#FDE725"))
#Heatmap
ComplexHeatmap::Heatmap(mat, col = my_colors)
I can use the col_fun
argument to highlight the cells in other ways (below). However, I would really like to highlight the cells by changing the cells fill opacity instead.
ComplexHeatmap::Heatmap(mat,
col = my_colors,
cell_fun = function(j, i, x, y, width, height, fill) {
if(highlight_matrix[i, j]){
grid.points(x, y, pch = 7,
gp = gpar(fontsize = 10))
}
})
You can use circlize::add_transparency
to give the color transparency (See https://jokergoo.github.io/circlize/reference/add_transparency.html).
Another option would be ggplot2 - ggalign:
library(grid)
# Starting Matrix
set.seed(1L)
mat <- matrix(runif(25), nrow = 5, ncol = 5)
rownames(mat) <- paste0("row", seq_len(nrow(mat)))
colnames(mat) <- paste0("col", seq_len(ncol(mat)))
# Matix showing which cells to highlight
highlight_matrix <- matrix(sample(c(TRUE, FALSE), 25, replace = TRUE), nrow = 5)
# Colors
my_colors <- circlize::colorRamp2(c(0, 1), c("#440154", "#FDE725"))
cheat_alpha <- ComplexHeatmap::Heatmap(mat,
col = my_colors, rect_gp = gpar(type = "none"),
cell_fun = function(j, i, x, y, width, height, fill) {
if (!highlight_matrix[i, j]) {
fill <- circlize::add_transparency(fill, 0.5)
}
grid::grid.rect(x, y,
width = width, height = height,
gp = gpar(fill = fill)
)
},
column_title = "ComplexHeatmap with transpancy"
)
cheat_no_alpha <- ComplexHeatmap::Heatmap(mat, my_colors,
column_title = "ComplexHeatmap no transpancy"
)
# ggalign maybe a little verbose, but gave you full ggplot2 syntax
library(ggalign)
highlight <- reshape2::melt(highlight_matrix,
varnames = c(".y", ".x"),
value.name = "highlight"
)
ggalign_alpha <- ggheatmap(mat, aes(alpha = alpha)) +
hmanno(plot_data = function(data) {
data <- dplyr::full_join(data, highlight, by = c(".x", ".y"))
dplyr::mutate(data, alpha = ifelse(.data$highlight, 1, 0.5))
}) +
scale_alpha_identity() +
scale_fill_gradient(low = "#440154", high = "#FDE725") +
ggtitle("ggalign with transpancy")
ggalign_no_alpha <- ggheatmap(mat) +
scale_fill_gradient(low = "#440154", high = "#FDE725") +
ggtitle("ggalign no transpancy")
# ggalign can align ggplot2, pheatmap, ComplexHeatmap et al.
align_plots(cheat_alpha, cheat_no_alpha,
ggalign_alpha, ggalign_no_alpha,
nrow = 2L
)
})
Created on 2024-10-14 with reprex v2.1.0