ComplexHeatmap es un paquete de Bioconductor que permite crear mapas de calor muy personalizables, añadir anotaciones, dividirlos en grupos y combinar varios mapas de calor en una misma figura. Es muy popular para visualizar datos de expresión génica, pero puedes utilizarlo con cualquier matriz numérica.
En este tutorial vamos a utilizar una matriz simulada con la expresión de 20 genes (filas) en 10 muestras (columnas), cinco de ellas de un grupo control y cinco de un grupo de tratamiento. Ten en cuenta que los valores están escalados por filas (z-scores), que es lo habitual para comparar la expresión de genes con distintos niveles.
set.seed(5)
mat <- matrix(rnorm(200), nrow = 20,
dimnames = list(paste0("Gene", 1:20), paste0("S", 1:10)))
mat[1:7, 6:10] <- mat[1:7, 6:10] + 3.5
mat[8:14, 6:10] <- mat[8:14, 6:10] - 3.5
# Escalado por filas
mat <- t(scale(t(mat)))
grupo <- rep(c("Control", "Tratamiento"), each = 5)
Heatmap
Para instalar el paquete necesitarás el paquete BiocManager, ya que ComplexHeatmap está disponible en Bioconductor. Luego, pasa la matriz a la función Heatmap. Por defecto, se agrupan las filas y las columnas y se muestran los dendrogramas. Usa el argumento name para establecer el título de la leyenda.
# install.packages("BiocManager")
# BiocManager::install("ComplexHeatmap")
library(ComplexHeatmap)
Heatmap(mat, name = "Z-score")


Los colores se establecen con el argumento col, que recibe una función de asignación de colores creada con colorRamp2 del paquete circlize. Tendrás que pasar los valores al primer argumento y los colores correspondientes al segundo, de modo que puedes crear escalas divergentes centradas en cero, que son las más adecuadas para los z-scores.
# install.packages("circlize")
library(circlize)
col_fun <- colorRamp2(c(-2, 0, 2), c("#2166AC", "white", "#B2182B"))
Heatmap(mat, name = "Z-score", col = col_fun)
El clustering se puede personalizar con los argumentos clustering_distance_rows y clustering_method_rows (y sus equivalentes para las columnas), eligiendo la distancia, como "euclidean" o "pearson", y el método del clúster jerárquico. Además, puedes eliminar el clustering de las columnas con cluster_columns = FALSE para mantener el orden original de las muestras.
Heatmap(mat, name = "Z-score", col = col_fun,
clustering_distance_rows = "pearson",
clustering_method_rows = "average",
cluster_columns = FALSE)


Las anotaciones son una de las principales ventajas de ComplexHeatmap. Puedes añadir información sobre las muestras, como el grupo de cada una, creando una anotación con HeatmapAnnotation y pasándola a top_annotation. Los colores de cada categoría se establecen con un vector con nombres dentro de una lista.
ha <- HeatmapAnnotation(Grupo = grupo,
col = list(Grupo = c(Control = "#2A9D8F",
Tratamiento = "#E9C46A")))
Heatmap(mat, name = "Z-score", col = col_fun,
top_annotation = ha)
Anotaciones con gráficos
Las anotaciones también pueden contener gráficos. En este ejemplo añadimos un gráfico de barras a la derecha del mapa de calor con el valor medio de cada gen en el grupo de tratamiento, utilizando rowAnnotation y anno_barplot.
ra <- rowAnnotation(Media = anno_barplot(rowMeans(mat[, 6:10])))
Heatmap(mat, name = "Z-score", col = col_fun,
top_annotation = ha,
right_annotation = ra)


Puedes dividir el mapa de calor en grupos para que los patrones se vean mejor. column_split divide las columnas en base a una variable, como el grupo de cada muestra, mientras que row_km divide las filas en el número de clusters indicado con k-means. Ten en cuenta que también puedes dividir las filas con una variable usando row_split.
Heatmap(mat, name = "Z-score", col = col_fun,
top_annotation = ha,
column_split = grupo,
row_km = 3)
Si quieres mostrar los valores dentro de las celdas usa el argumento cell_fun, que recibe una función que se aplica a cada celda. En este ejemplo utilizamos grid.text para escribir los valores con un decimal y rect_gp para añadir bordes blancos a las celdas.
Heatmap(mat[1:10, ], name = "Z-score", col = col_fun,
rect_gp = gpar(col = "white", lwd = 1),
cell_fun = function(j, i, x, y, width, height, fill) {
grid.text(sprintf("%.1f", mat[i, j]), x, y,
gp = gpar(fontsize = 8))
})


La posición de las leyendas se establece al dibujar el mapa de calor con la función draw, mediante los argumentos heatmap_legend_side y annotation_legend_side. La leyenda también se puede personalizar con el argumento heatmap_legend_param, por ejemplo, para mostrarla en horizontal.
ht <- Heatmap(mat, name = "Z-score", col = col_fun,
top_annotation = ha,
heatmap_legend_param = list(direction = "horizontal"))
draw(ht, heatmap_legend_side = "bottom",
annotation_legend_side = "bottom")
Si necesitas una alternativa más sencilla también puedes utilizar la función pheatmap, la función heatmap de R base o crear un mapa de calor en ggplot2 con geom_tile. En los análisis de expresión génica es habitual seleccionar los genes a mostrar con un volcano plot.
Aprende estadística desde lo básico hasta técnicas avanzadas, explicado con claridad
Ir al sitio
También te puede interesar