Trazar la matriz de correlación en un gráfico


93

Tengo una matriz con algunos valores de correlación. Ahora quiero trazar eso en un gráfico que se parece más o menos a eso:

ingrese la descripción de la imagen aquí

¿Cómo puedo lograrlo?


Puede encontrar esta función interesante: gist.github.com/low-decarie/5886616 aunque todavía necesita ser mejorada ( stackoverflow.com/questions/17370853/… )
Etienne Low-Décarie

@anon, ¿puedes compartir el código para esto? esto es exactamente lo que estoy buscando para mi presentación
Pavlos Panteliadis

Respuestas:


57

Rápido, sucio y en el estadio:

library(lattice)

#Build the horizontal and vertical axis information
hor <- c("214", "215", "216", "224", "211", "212", "213", "223", "226", "225")
ver <- paste("DM1-", hor, sep="")

#Build the fake correlation matrix
nrowcol <- length(ver)
cor <- matrix(runif(nrowcol*nrowcol, min=0.4), nrow=nrowcol, ncol=nrowcol, dimnames = list(hor, ver))
for (i in 1:nrowcol) cor[i,i] = 1

#Build the plot
rgb.palette <- colorRampPalette(c("blue", "yellow"), space = "rgb")
levelplot(cor, main="stage 12-14 array correlation matrix", xlab="", ylab="", col.regions=rgb.palette(120), cuts=100, at=seq(0,1,0.01))

ingrese la descripción de la imagen aquí


2
Se parece mucho al ejemplo de OP (fuentes, colores, diseño). Parece que el original también se creó con celosía. Gran respuesta detallada, +1.
Marek

1
Gracias por la respuesta. Mucha gente está acostumbrada a diagramas de correlación en los que la diagonal que contiene 1-s va desde el cuadrado superior izquierdo al cuadrado inferior derecho (vea la figura de ejemplo en la pregunta), en lugar de hacerlo desde el cuadrado inferior izquierdo al superior derecho, como en su solución. He aquí cómo solucionar este problema: cor_reversed <- apply (cor, 2, rev); levelplot (t (cor_reversed), ...)
omitir el

@ bill_080 ¿por qué copiar y pegar su código no imprime la matriz de correlación?
Pavlos Panteliadis

59

Más bien parece "menos", pero vale la pena verificarlo (ya que brinda más información visual):

Elipses matriz de correlación : Elipses de la matriz de correlación círculos matriz de correlación : Círculos de la matriz de correlación

Encuentre más ejemplos en la viñeta de corrplot a la que hace referencia @assylias a continuación.


1
El sitio parece haber desaparecido. ¿Tiene algún código o descripción de paquete para la primera parcela?
estrella brillante

1
@TrevorAlexander: Por lo que recuerdo, la primera trama fue creada por ellipse:plotcorr.
daroczig

Envié una edición para el enlace 1 a: improvement-visualisation.org/vis/id=250 que proporciona la misma imagen.
russellpierce

1
Gracias @rpierce, aunque solo veo la imagen sin la fuente R. ¿Qué extraño aquí?
daroczig


43

Muy fácil con lattice :: levelplot:

z <- cor(mtcars)
require(lattice)
levelplot(z)

ingrese la descripción de la imagen aquí


30

La biblioteca ggplot2 puede manejar esto con geom_tile(). Parece que se puede haber realizado un cambio de escala en el gráfico anterior, ya que no hay correlaciones negativas, así que tenga eso en cuenta con sus datos. Usando el mtcarsconjunto de datos:

library(ggplot2)
library(reshape)

z <- cor(mtcars)
z.m <- melt(z)

ggplot(z.m, aes(X1, X2, fill = value)) + geom_tile() + 
scale_fill_gradient(low = "blue",  high = "yellow")

ingrese la descripción de la imagen aquí

EDITAR :

ggplot(z.m, aes(X1, X2, fill = value)) + geom_tile() + 
scale_fill_gradient2(low = "blue",  high = "yellow")

ingrese la descripción de la imagen aquí

permite especificar el color del punto medio y el valor predeterminado es blanco, por lo que puede ser un buen ajuste aquí. Se pueden encontrar otras opciones en el sitio web de ggplot aquí y aquí .


agradable (+1)! Aunque agregaría una escala de ruptura manual (por ejemplo c(-1, -0.6, -0.3, 0, 0.3, 0.6, 1):) "white"en el medio para permitir que los colores reflejen la simetría de la correlación de manera eficiente.
daroczig

@Daroczig - Buen punto. Parece que scale_fill_gradient2()logra la funcionalidad que describe automáticamente. No sabía que existía.
Chase

1
agregando a esto: p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)lo hará interactivo
schlusie

Para hacer que las diagonales 1 vayan de la parte superior izquierda a la inferior derecha, se requiere invertir los niveles de los factores para X1usar:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
arun

11

Utilice el paquete corrplot:

library(corrplot)
data(mtcars)
M <- cor(mtcars)
##  different color series
col1 <- colorRampPalette(c("#7F0000","red","#FF7F00","yellow","white", 
        "cyan", "#007FFF", "blue","#00007F"))
col2 <- colorRampPalette(c("#67001F", "#B2182B", "#D6604D", "#F4A582", "#FDDBC7",
        "#FFFFFF", "#D1E5F0", "#92C5DE", "#4393C3", "#2166AC", "#053061"))  
col3 <- colorRampPalette(c("red", "white", "blue")) 
col4 <- colorRampPalette(c("#7F0000","red","#FF7F00","yellow","#7FFF7F", 
        "cyan", "#007FFF", "blue","#00007F"))   
wb <- c("white","black")


par(ask = TRUE)


## different color scale and methods to display corr-matrix
corrplot(M, method="number", col="black", addcolorlabel="no")
corrplot(M, method="number")
corrplot(M)
corrplot(M, order ="AOE")
corrplot(M, order ="AOE", addCoef.col="grey")

corrplot(M, order="AOE", col=col1(20), cl.length=21,addCoef.col="grey")
corrplot(M, order="AOE", col=col1(10),addCoef.col="grey")

corrplot(M, order="AOE", col=col2(200))
corrplot(M, order="AOE", col=col2(200),addCoef.col="grey")
corrplot(M, order="AOE", col=col2(20), cl.length=21,addCoef.col="grey")
corrplot(M, order="AOE", col=col2(10),addCoef.col="grey")

corrplot(M, order="AOE", col=col3(100))
corrplot(M, order="AOE", col=col3(10))



corrplot(M, method="color", col=col1(20), cl.length=21,order = "AOE", addCoef.col="grey")

if(TRUE){

corrplot(M, method="square", col=col2(200),order = "AOE")

corrplot(M, method="ellipse", col=col1(200),order = "AOE")


corrplot(M, method="shade", col=col3(20),order = "AOE")

corrplot(M, method="pie", order = "AOE")


## col=wb
corrplot(M, col = wb, order="AOE", outline=TRUE, addcolorlabel="no")
## like Chinese wiqi, suit for either on screen or white-black print.
corrplot(M, col = wb, bg="gold2",  order="AOE", addcolorlabel="no")
}

Por ejemplo:

ingrese la descripción de la imagen aquí

Bastante elegante en mi opinión


9

Ese tipo de gráfico se denomina "mapa de calor", entre otros términos. Una vez que tenga su matriz de correlación, grábelo usando uno de los diversos tutoriales que existen.

Usando gráficos base: http://flowingdata.com/2010/01/21/how-to-make-a-heatmap-a-quick-and-easy-solution/

Usando ggplot2: http://learnr.wordpress.com/2010/01/26/ggplot2-quick-heatmap-plotting/


No estoy seguro de si llamarlo 'mapa de calor' es una invención bastante moderna. Parece tener sentido si está tratando de mostrar 'puntos calientes' usando un esquema de color rojo-naranja-amarillo, pero en general es solo una gráfica de imagen, una gráfica de matriz o una gráfica de trama. Me interesaría encontrar la referencia más antigua que lo llame "mapa de calor". tldr; "[cita requerida]"
Spacedman

Creo que tienes razón en que mapa de calor no es necesariamente el nombre más antiguo. Wikipedia enumera un artículo de 1957, pero lo comprobé y el término "mapa de calor" no aparece en ninguna parte (ni los gráficos se ven exactamente como en el formulario actual).
Ari B. Friedman

5

He estado trabajando en algo similar a la visualización publicada por @daroczig, con código publicado por @Ulrik usando la plotcorr()función delellipse paquete. Me gusta el uso de elipses para representar correlaciones y el uso de colores para representar correlaciones negativas y positivas. Sin embargo, quería que los colores llamativos se destacaran por correlaciones cercanas a 1 y -1, no por aquellas cercanas a 0.

Creé una alternativa en la que se superponen elipses blancas sobre círculos de colores. Cada elipse blanca tiene un tamaño de modo que la proporción del círculo de color visible detrás de ella sea igual a la correlación al cuadrado. Cuando la correlación está cerca de 1 y -1, la elipse blanca es pequeña y gran parte del círculo de color es visible. Cuando la correlación está cerca de 0, la elipse blanca es grande y se ve poco del círculo de color.

La función, plotcor()está disponible en https://github.com/JVAdams/jvamisc/blob/master/R/plotcor.r .

A continuación se muestra un ejemplo del gráfico resultante utilizando el mtcarsconjunto de datos.

library(plotrix)
library(seriation)
library(MASS)
plotcor(cor(mtcars), mar=c(0.1, 4, 4, 0.1))

resultado de la llamada a la función plotcor ()


3

Me doy cuenta de que ha pasado un tiempo, pero los nuevos lectores podrían estar interesados ​​en rplot()el corrrpaquete ( https://cran.rstudio.com/web/packages/corrr/index.html ), que puede producir el tipo de tramas que menciona @daroczig , pero diseño para un enfoque de canalización de datos:

install.packages("corrr")
library(corrr)
mtcars %>% correlate() %>% rplot()

ingrese la descripción de la imagen aquí

mtcars %>% correlate() %>% rearrange() %>% rplot()

ingrese la descripción de la imagen aquí

mtcars %>% correlate() %>% rearrange() %>% rplot(shape = 15)

ingrese la descripción de la imagen aquí

mtcars %>% correlate() %>% rearrange() %>% shave() %>% rplot(shape = 15)

ingrese la descripción de la imagen aquí

mtcars %>% correlate() %>% rearrange(absolute = FALSE) %>% rplot(shape = 15)

ingrese la descripción de la imagen aquí



1

Otra solución que aprendí recientemente es un mapa de calor interactivo creado con el paquete qtlcharts .

install.packages("qtlcharts")
library(qtlcharts)
iplotCorr(mat=mtcars, group=mtcars$cyl, reorder=TRUE)

A continuación se muestra una imagen estática del gráfico resultante. ingrese la descripción de la imagen aquí

Puedes ver la versión interactiva en mi blog . Desplácese sobre el mapa de calor para ver los valores de fila, columna y celda. Haga clic en una celda para ver un diagrama de dispersión con símbolos coloreados por grupo (en este ejemplo, el número de cilindros, 4 es rojo, 6 es verde y 8 es azul). Al pasar el cursor sobre los puntos en la gráfica de dispersión, se obtiene el nombre de la fila (en este caso, la marca del automóvil).


0

Como no puedo comentar, tengo que dar mi 2c a la respuesta de daroczig como respuesta ...

El diagrama de dispersión de elipse es de hecho del paquete de elipse y se genera con:

corr.mtcars <- cor(mtcars)
ord <- order(corr.mtcars[1,])
xc <- corr.mtcars[ord, ord]
colors <- c("#A50F15","#DE2D26","#FB6A4A","#FCAE91","#FEE5D9","white",
            "#EFF3FF","#BDD7E7","#6BAED6","#3182BD","#08519C")   
plotcorr(xc, col=colors[5*xc + 6])

(de la página del manual)

El paquete corrplot también puede, como se sugiere, ser útil con bonitas imágenes que se encuentran aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.