Fecha de la ultima revisión
## [1] "2023-08-22"
library(ggversa)
library(GGally)
library(tidyverse)
library(kableExtra)
library(reshape2)
Cuando hay muchas variables en el análisis, a veces podría ser más fácil observar las diferencias entre ellas usando colores en vez de números; por ejemplo, para visualizar los coeficientes de correlación entre pares de variables continuas. Un mapa de calor (heat map en inglés) nos puede ayudar pues justamente es una visualización con gradientes de colores de valores continuos. Continuaremos utilizando la base de datos de la orquídea Dipodium para explicar los tres pasos para construir un mapa de calor de los coeficientes de correlación.
Primero, necesitamos calcular los coeficientes de correlación con la opción cor. Luego visualizaremos los datos con la función kable.
DWCor=round(cor(dipodium[c(3, 6, 8, 9, 13)],
use="pairwise.complete.obs"),3)
kable(DWCor) %>%
kable_styling(bootstrap_options = "striped", full_width = F, font_size = 10)
DBH | Distance | Number_of_Flowers | Height_Inflo | Number_of_fruits | |
---|---|---|---|---|---|
DBH | 1.000 | 0.329 | -0.035 | -0.100 | -0.009 |
Distance | 0.329 | 1.000 | 0.042 | -0.095 | -0.157 |
Number_of_Flowers | -0.035 | 0.042 | 1.000 | 0.818 | 0.234 |
Height_Inflo | -0.100 | -0.095 | 0.818 | 1.000 | 0.106 |
Number_of_fruits | -0.009 | -0.157 | 0.234 | 0.106 | 1.000 |
Segundo, reorganizaremos los datos en un data.frame usando la librería reshape2 y la opción melt. En nuestro caso, lo que queremos es producir un data.frame con solo dos columnas con las variables en pares con su respectivo valor de correlación. En el nuevo data.frame, DWMelt, vemos tres columnas cada una representando las variables y la última con el valor de correlación.
DWMelt= melt(DWCor, varnames= c("x1", "y1"),
value.name = "Correlation")
head(DWMelt)
## x1 y1 Correlation
## 1 DBH DBH 1.000
## 2 Distance DBH 0.329
## 3 Number_of_Flowers DBH -0.035
## 4 Height_Inflo DBH -0.100
## 5 Number_of_fruits DBH -0.009
## 6 DBH Distance 0.329
Finalmente, el tercer paso es producir la figura con geom_tile. El gráfico de la Figura se produce sin modificar los parámetros. En el segundo gráfico se modifican los colores usando la guía de color para asignarlos a diferentes grupos a la vez que se remueven los nombres de los ejes de X y de Y. A este mapa de calor básico se le asignan las variables de x y y y el valor que queremos que tenga un rango de color, en este caso el valor de correlación. Para remover el nombre de la variables x y y, se usa labs(x=NULL, y=NULL), ya que ggplot2 lo pone automáticamente cuando se construye un gráfico.
ggplot(DWMelt, aes(x=x1, y=y1))+
geom_tile(aes(fill=Correlation))+
theme(axis.text.y=element_text(size=10, face="bold"),
axis.text.x=element_text(size=8, face="bold", angle = 90, hjust = 1))+
labs(fill="Correlación")
Le cambiamos los colores del gráfico, usando scale_fill_gradient2. Asignamos los valores más bajos al color amarillo, los más altos al rojo y los valores intermedios al color anaranjado. Para esta opción de scale_fill_gradient2, hay que asignar tanto los colores al extremo y el del medio. El resultado se puede ver en la Figura. Note que los valores de correlaciones varían de -1 a +1. El límite del rango se asigna especificando limits=c(valor mínimo, valor máximo). Dado esto, en este ejemplo la intensidad de colores no es tan amplia porque no hay valores muy negativos.
ggplot(DWMelt, aes(x=x1, y=y1))+
geom_tile(aes(fill=Correlation))+
scale_fill_gradient2(low="white",
mid="orange", high="red",
guide=guide_colorbar(ticks=FALSE,
barheight=5, limits=c(-1,1)))+
theme_minimal()+
labs(x=NULL, y=NULL)+
theme(axis.title=element_text(size=20,face="bold"),
axis.text.y=element_text(size=10, face="bold"),
axis.text.x=element_text(size=8, face="bold", angle = 90, hjust = 1))+
labs(fill="Correlación")
En el siguiente gráfico, se cambia el valor intermedio a blanco (para valores más cercanos a cero).
ggplot(DWMelt, aes(x=x1, y=y1))+
geom_tile(aes(fill=Correlation))+
scale_fill_gradient2(low="yellow",
mid="white", high="red",
guide=guide_colorbar(ticks=FALSE,
barheight=5, limits=c(-1,1)))+
theme_minimal()+
labs(x=NULL, y=NULL)+
theme(axis.title=element_text(size=20,face="bold"),
axis.text.y=element_text(size=10, face="bold"),
axis.text.x=element_text(size=8, face="bold", angle = 90, hjust = 1))+
labs(fill="Correlación")
Se puede también hacer la selección de solamente dos colores con la función scale_fill_gradient (vea que esa opción no es lo mismo que scale_fill_gradient2). En este caso los gradientes de colores en el centro de la distribución (el cero) no está definido.
ggplot(DWMelt, aes(x=x1, y=y1))+
geom_tile(aes(fill=Correlation))+
scale_fill_gradient(low="white",
high="red", limits=c(-1,1))+
theme_minimal()+labs(x=NULL, y=NULL)+
theme(axis.title=element_text(size=20,face="bold"),
axis.text.y=element_text(size=10, face="bold"),
axis.text.x=element_text(size=8, face="bold", angle = 90, hjust = 1))+
labs(fill="Correlación")
La función ggcor tiene la ventaja de producir un gráfico de calor que representa solamente un espejo de los resultados. En los gráficos anteriores las misma información estaba ariba y abajo de la diagonal. Este represente solamente uno de los dos.
ggcorr(DWCor, low = "steelblue", mid = "white", high = "darkred", nbreaks=5)
Para un segundo ejemplo de ggcorr
ggcorr(DWCor, geom = "blank", label = TRUE, hjust = 0.75) +
geom_point(size = 10, aes(color = coefficient > 0, alpha = abs(coefficient) > 0.5)) +
scale_alpha_manual(values = c("TRUE" = 0.25, "FALSE" = 0)) +
guides(color = FALSE, alpha = FALSE)
Para muchos ejemplos vea este enlace. https://briatte.github.io/ggcorr/
ggplot(el archivo de datos, aes(x= la variable discreta, y=variable continua, ymax= el valor máximo, ymin= el valor mínimo))
geom_tile(x, y, alpha, color, fill, linetype, size)
alpha: la intensidad del color
color: el color de la línea
fill: el color de los cuadros
linetype: representa el estilo de línea
size: representa el ancho de la línea