Un mapa térmico (o mapa de calor) es otra forma de visualizar la agrupación jerárquica. Es también llamada imagen en falso color, en la que los valores de los datos se transforman en escala de colores.Los mapas de calor nos permiten visualizar simultáneamente clusters de muestras y características. En primer lugarla agrupación jerárquica se realiza tanto de las filas como de las columnas de la matriz de datos. Las columnas y filas de la matriz de datos se reordenan de acuerdo con el resultado de la agrupación jerárquica.acercando las observaciones similares. Los bloques de valores y “bajos” son adyacentes en la matriz de datos. Por último, se aplica un esquema de colores para la visualización y se muestra la matriz de datos. Visualizar la matriz de datos de esta puede ayudar a encontrar las variables que parecen ser características de cada conglomerado de muestras cluster.
Existe un gran número de paquetes y funciones de R para dibujar mapas térmicos interactivos y estáticos. estáticos, incluyendo: - heatmap() [función base de R, paquete stats]: Dibuja un mapa de calor simple - heatmap.2 () [paquete gplots R]: Dibuja un mapa de calor mejorado en comparación con la función base de R. y otras mas…
Utilizamos los datos de mtcars como conjunto de datos de demostración. Comenzamos estandarizando los datos para variables sean comparables:
df <- scale(mtcars)
Se puede utilizar la función incorporada R heatmap() [en el paquete stats]. Un formato simplificado es:
# heatmap(x, scale = "row")
x: una matriz numérica escala: un carácter que indica si los valores deben centrarse y escalarse en la dirección de la fila o la dirección de la columna, o ninguna. Los valores permitidos están en c(“fila”, “columna”, “ninguna”). Por defecto es “fila”.
heatmap(df, scale = "none")
Es posible especificar una paleta de colores utilizando el argumento
col, que puede definirse como seguir: - Uso de colores
personalizados:
col<- colorRampPalette(c("red", "white", "blue"))(256)
library("RColorBrewer")
col <- colorRampPalette(brewer.pal(10, "RdYlBu"))(256)
Además, puede utilizar el argumento RowSideColors y ColSideColors para anotar filas y columnas, respectivamente
Por ejemplo, en el siguiente código R personalizará el mapa de calor de la siguiente manera: 1. Se utiliza un nombre de paleta de colores RColorBrewer para cambiar la apariencia 2. El argumento RowSideColors y ColSideColors se utilizan para anotar filas y columnas respectivamente. Los valores esperados para estas opciones son un vector que contiene nombres de colores que especifican las clases para filas/columnas.
library("RColorBrewer")
col <- colorRampPalette(brewer.pal(10, "RdYlBu"))(256)
heatmap(df, scale = "none", col = col,
RowSideColors = rep(c("blue", "pink"), each = 16),
ColSideColors = c(rep("purple", 5), rep("orange", 6)))
La función heatmap.2 () [en el paquete gplots] proporciona muchas extensiones a la función estándar R heatmap() estándar presentada en la sección anterior.
library("gplots")
##
## Attaching package: 'gplots'
## The following object is masked from 'package:stats':
##
## lowess
heatmap.2(df, scale = "none", col = bluered(100),
trace = "none", density.info = "none")
Se pueden utilizar otros argumentos como - labRow, labCol - hclustfun: hclustfun=function(x) hclust(x, method=“ward”) En el código R anterior, se utiliza la función bluered() [del paquete gplots] para generar un conjunto de colores que varían suavemente. También puede utilizar el siguiente generador de color funciones: - colorpanel(n, bajo, medio, alto) - n: Número deseado de elementos de color a generar - bajo, medio, alto: Colores a utilizar para los valores bajo, medio y alto. mid puede omitirse. - rojoverde(n), verderojo(n), azulrojo(n) y rojoazul(n)
library("pheatmap")
pheatmap(df, cutree_rows = 4)
Se dispone de argumentos para cambiar la métrica de agrupación por defecto (“euclídea”) y el método (“completo”). También es posible anotar filas y columnas mediante variables de agrupación
#library("d3heatmap")
#d3heatmap(scale(mtcars), colors = "RdYlBu",
#k_row = 4, # Number of groups in rows
#k_col = 2 # Number of groups in columns
#)
La función d3heamap() permite: - Colocar el ratón sobre una celda del mapa de calor de interés para ver la fila y la columna así como el valor correspondiente. - Seleccionar un área para hacer zoom. Después de hacer zoom, haga clic de nuevo en el mapa térmico para volver a la visualización anterior
El paquete dendextend puede utilizarse para mejorar funciones de otros paquetes. Los datos de mtcars se utiliza en las secciones siguientes. Empezaremos definiendo el orden y la apariencia de las filas y columnas utilizando dendextend. Estos resultados se utilizan en otras funciones de otros paquetes
library(dendextend)
##
## ---------------------
## Welcome to dendextend version 1.17.1
## Type citation('dendextend') for how to cite the package.
##
## Type browseVignettes(package = 'dendextend') for the package vignette.
## The github page is: https://github.com/talgalili/dendextend/
##
## Suggestions and bug-reports can be submitted at: https://github.com/talgalili/dendextend/issues
## You may ask questions at stackoverflow, use the r and dendextend tags:
## https://stackoverflow.com/questions/tagged/dendextend
##
## To suppress this message use: suppressPackageStartupMessages(library(dendextend))
## ---------------------
##
## Attaching package: 'dendextend'
## The following object is masked from 'package:stats':
##
## cutree
# order for rows
Rowv <- mtcars %>% scale %>% dist %>% hclust %>% as.dendrogram %>%
set("branches_k_color", k = 3) %>% set("branches_lwd", 1.2) %>%
ladderize
# Order for columns: We must transpose the data
Colv <- mtcars %>% scale %>% t %>% dist %>% hclust %>% as.dendrogram %>%
set("branches_k_color", k = 2, value = c("orange", "blue")) %>%
set("branches_lwd", 1.2) %>%
ladderize
Los argumentos anteriores pueden utilizarse en las funciones siguientes: 1. La función estándar heatmap() [en el paquete stats]:
heatmap(scale(mtcars), Rowv = Rowv, Colv = Colv,
scale = "none")
library(gplots)
heatmap.2(scale(mtcars), scale = "none", col = bluered(100),
Rowv = Rowv, Colv = Colv,
trace = "none", density.info = "none")
#library("d3heatmap")
#d3heatmap(scale(mtcars), colors = "RdBu",
#Rowv = Rowv, Colv = Colv)
ComplexHeatmap es un paquete R/bioconductor, desarrollado por Zuguang Gu, que proporciona una solución flexible para organizar y anotar múltiples mapas de calor. También permite visualizar la asociación entre distintos datos de distintas fuentes.
Puedes dibujar un sencillo mapa de calor como se indica a continuación:
library(ComplexHeatmap)
## Loading required package: grid
## ========================================
## ComplexHeatmap version 2.14.0
## Bioconductor page: http://bioconductor.org/packages/ComplexHeatmap/
## Github page: https://github.com/jokergoo/ComplexHeatmap
## Documentation: http://jokergoo.github.io/ComplexHeatmap-reference
##
## If you use it in published research, please cite either one:
## - Gu, Z. Complex Heatmap Visualization. iMeta 2022.
## - Gu, Z. Complex heatmaps reveal patterns and correlations in multidimensional
## genomic data. Bioinformatics 2016.
##
##
## The new InteractiveComplexHeatmap package can directly export static
## complex heatmaps into an interactive Shiny app with zero effort. Have a try!
##
## This message can be suppressed by:
## suppressPackageStartupMessages(library(ComplexHeatmap))
## ========================================
## ! pheatmap() has been masked by ComplexHeatmap::pheatmap(). Most of the arguments
## in the original pheatmap() are identically supported in the new function. You
## can still use the original function by explicitly calling pheatmap::pheatmap().
##
## Attaching package: 'ComplexHeatmap'
## The following object is masked from 'package:pheatmap':
##
## pheatmap
Heatmap(df,
name = "mtcars", #title of legend
column_title = "Variables", row_title = "Samples",
row_names_gp = gpar(fontsize = 7) # Text size for row names
)
Argumentos adicionales: 1. mostrar_nombres_fila, mostrar_nombres_columna: si se desea mostrar la fila y la columna. respectivamente. El valor por defecto es TRUE 2. show_row_hclust, show_column_hclust: valor lógico; si mostrar clusters de fila y columnas. El valor por defecto es TRUE 3. clustering_distance_rows, clustering_distance_columns: métrica para la agrupación: “euclidean”, “maximum”, “manhattan”, “canberra”, “binary”, “minkowski”, “pearson”, “spearman”, “kendall”) 4. clustering_method_rows, clustering_method_columns: métodos de agrupación: “ward.D”, “ward.D2”, “single”, “complete”, “average”, . . . (véase ?hclust). Para especificar colores personalizados, debe utilizar la función colorRamp2 () [circlize paquete], como se indica a continuación:
library(circlize)
## ========================================
## circlize version 0.4.15
## CRAN page: https://cran.r-project.org/package=circlize
## Github page: https://github.com/jokergoo/circlize
## Documentation: https://jokergoo.github.io/circlize_book/book/
##
## If you use it in published research, please cite:
## Gu, Z. circlize implements and enhances circular visualization
## in R. Bioinformatics 2014.
##
## This message can be suppressed by:
## suppressPackageStartupMessages(library(circlize))
## ========================================
mycols <- colorRamp2(breaks = c(-2, 0, 2),
colors = c("green", "white", "red"))
Heatmap(df, name = "mtcars", col = mycols)
También es posible utilizar paletas de colores RColorBrewer:
library("circlize")
library("RColorBrewer")
Heatmap(df, name = "mtcars",
col = colorRamp2(c(-2, 0, 2), brewer.pal(n=3, name="RdBu")))
También podemos personalizar la apariencia de los dendogramas utilizando
la función color_branches() [paquete dendextend]:
library(dendextend)
row_dend = hclust(dist(df)) # row clustering
col_dend = hclust(dist(t(df))) # column clustering
Heatmap(df, name = "mtcars",
row_names_gp = gpar(fontsize = 6.5),
cluster_rows = color_branches(row_dend, k = 4),
cluster_columns = color_branches(col_dend, k = 2))
Puede dividir el mapa de calor utilizando el algoritmo k-means o una variable de agrupación. Es importante utilizar la función set.seed() al realizar k-means para que los resultados obtenidos puedan reproducirse con precisión posteriormente. - Para dividir el dendrograma utilizando k-means, escriba esto:
set.seed(2)
Heatmap(df, name = "mtcars", k = 2)
Para dividir por una variable de agrupación, utilice el argumento split.
En el siguiente ejemplo utilizaremos los niveles de la variable factor
cyl [en el conjunto de datos mtcars] para dividir el mapa de calor por
filas. Recordemos que la columna cyl corresponde al número de
cilindros.
Heatmap(df, name = "mtcars", split = mtcars$cyl,
row_names_gp = gpar(fontsize = 7))
Tenga en cuenta que split también puede ser un marco de datos en el que diferentes combinaciones de niveles dividen las filas del mapa térmico.
Heatmap(df, name ="mtcars",
split = data.frame(cyl = mtcars$cyl, am = mtcars$am))
La clase HeatmapAnnotation se utiliza para definir anotaciones en filas o columnas. A formato simplificado es:
# HeatmapAnnotation(df, name, col, show_legend)
df <- t(df)
Para anotar filas o columnas se utiliza un vector que contiene valores discretos o continuos. Utilizaremos las variables cualitativas cyl (niveles = “4”, “5” y “8”) y am (niveles = “0”y “1”), y la variable continua mpg para anotar las columnas.Para cada una de estas 3 variables, los colores personalizados se definen como sigue:
datos <- t(scale(mtcars))
annot_df <- data.frame(cyl = mtcars$cyl, am = mtcars$am,mpg = mtcars$mpg)
library(circlize)
col = list(cyl = c("4" = "green", "6" = "gray", "8" = "darkred"),
am = c("0" = "yellow", "1" = "orange"),
mpg = circlize::colorRamp2(c(17, 25),
c("lightblue", "purple")) )
ha <- HeatmapAnnotation(df = annot_df, col = col)
Heatmap( matrix = datos, name = "mtcars", top_annotation = ha )
Es posible ocultar la leyenda de la anotación utilizando el argumento show_legend = FALSE como sigue:
ha <- HeatmapAnnotation(df = annot_df, col = col, show_legend = FALSE)
Heatmap(matrix = datos, name = "mtcars", top_annotation = ha )
En esta sección veremos cómo combinar el mapa de calor y algunos gráficos básicos para mostrar la distribución de los datos. Para gráficos de anotación sencillos, pueden utilizarse las siguientes funciones pueden utilizarse: anno_points(), anno_barplot(), anno_boxplot(), anno_density() y anno_histogram(). A continuación se muestra un ejemplo:
# Define some graphics to display the distribution of columns
.hist = anno_histogram(df, gp = gpar(fill = "lightblue"))
.density = anno_density(df, type = "line", gp = gpar(col = "blue"))
ha_mix_top = HeatmapAnnotation(hist = .hist, density = .density)
# Define some graphics to display the distribution of rows
.violin = anno_density(df, type = "violin",
gp = gpar(fill = "lightblue"), which = "row")
.boxplot = anno_boxplot(df, which = "row")
ha_mix_right = HeatmapAnnotation(violin = .violin, bxplt = .boxplot,
which = "row", width = unit(4, "cm"))
# Combine annotation with heatmap
# Heatmap( df , name = "mtcars",column_names_gp = gpar(fontsize = 8),
# top_annotation = ha_mix_top, top_annotation_height = unit(3.8, "cm")) + ha_mix_right
Los mapas térmicos múltiples pueden organizarse del siguiente modo:
# Heatmap 1
ht1 = Heatmap(df, name = "ht1", km = 2,
column_names_gp = gpar(fontsize = 9))
# Heatmap 2
ht2 = Heatmap(df, name = "ht2",
col = circlize::colorRamp2(c(-2, 0, 2), c("green", "white", "red")),
column_names_gp = gpar(fontsize = 9))
ht1 + ht2
Tenga en cuenta que, al combinar varios mapas térmicos, el primero se considera el principal. Algunos ajustes de los mapas térmicos restantes se autoajustan según la configuración del mapa térmico principal. Entre ellos se incluyen: la eliminación de grupos de filas y títulos, y añadir división.
draw(ht1 + ht2,
row_title = "Two heatmaps, row title",
row_title_gp = gpar(col = "red"),
column_title = "Two heatmaps, column title",
column_title_side = "bottom",
# Gap between heatmaps
gap = unit(0.5, "cm"))
En los datos de expresión génica, las filas son genes y las columnas, muestras. Se puede adjuntar más información sobre los genes puede adjuntarse después del mapa térmico de expresión, como la longitud del gen y el tipo de genes
datos <- t(scale(mtcars))
expr <- readRDS(paste0(system.file(package = "ComplexHeatmap"),
"/extdata/gene_expression.rds"))
mat <- as.matrix(expr[, grep("cell", colnames(expr))])
type <- gsub("s\\d+_", "", colnames(mat))
ha = HeatmapAnnotation(df = data.frame(type = type))
#Heatmap( mat, name = "expression", km = 5, top_annotation = ha,
#top_annotation_height = unit(4, "mm"),
#show_row_names = FALSE, show_column_names = FALSE) +
#Heatmap(expr$length, name = "length", width = unit(5, "mm"),
#col = circlize::colorRamp2(c(0, 100000), c("white", "orange"))) +
#Heatmap(expr$type, name = "type", width = unit(5, "mm")) +
#Heatmap(expr$chr, name = "chr", width = unit(5, "mm"),
#col = circlize::rand_color(length(unique(expr$chr))))
También es posible visualizar alteraciones genómicas e integrar diferentes niveles moleculares (expresión génica, metilación del ADN, etc.).niveles moleculares (expresión génica, metilación del ADN, …). Lea la viñeta, en Bioconductor, para más ejemplos.