Librería

ComplexHeatmap

Datos de muestra

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)

La función 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")

Mapa de calor en R con la función Heatmap de ComplexHeatmap

Escala de color

Cambiar la escala de color de un mapa de calor con ComplexHeatmap y colorRamp2

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)

Clustering y dendrogramas

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)

Personalizar el clustering y los dendrogramas de un mapa de calor con ComplexHeatmap

Anotaciones

Mapa de calor con anotaciones de columna en ComplexHeatmap

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)

Mapa de calor con un gráfico de barras como anotación de fila en ComplexHeatmap

Dividir el mapa de calor

Dividir las filas y las columnas de un mapa de calor en ComplexHeatmap

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)

Mostrar los valores

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))
        })

Mapa de calor con los valores dentro de las celdas en ComplexHeatmap

Posición de la leyenda

Cambiar la posición de las leyendas de un mapa de calor en ComplexHeatmap

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.

MASTER - STATISTICS DOT COM

Master Statistics

Aprende estadística desde lo básico hasta técnicas avanzadas, explicado con claridad

Ir al sitio
R PACKAGES IO

R Packages

Explora y descubre miles de paquetes, funciones y datasets de R

Ir al sitio

También te puede interesar