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:
¿Cómo puedo lograrlo?
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:
¿Cómo puedo lograrlo?
Respuestas:
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))
Más bien parece "menos", pero vale la pena verificarlo (ya que brinda más información visual):
Elipses matriz de correlación : círculos matriz de correlación :
Encuentre más ejemplos en la viñeta de corrplot a la que hace referencia @assylias a continuación.
ellipse:plotcorr
.
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 mtcars
conjunto 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")
EDITAR :
ggplot(z.m, aes(X1, X2, fill = value)) + geom_tile() +
scale_fill_gradient2(low = "blue", high = "yellow")
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í .
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.
scale_fill_gradient2()
logra la funcionalidad que describe automáticamente. No sabía que existía.
p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)
lo hará interactivo
X1
usar:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
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:
Bastante elegante en mi opinión
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/
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 mtcars
conjunto de datos.
library(plotrix)
library(seriation)
library(MASS)
plotcor(cor(mtcars), mar=c(0.1, 4, 4, 0.1))
Me doy cuenta de que ha pasado un tiempo, pero los nuevos lectores podrían estar interesados en rplot()
el corrr
paquete ( 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()
mtcars %>% correlate() %>% rearrange() %>% rplot()
mtcars %>% correlate() %>% rearrange() %>% rplot(shape = 15)
mtcars %>% correlate() %>% rearrange() %>% shave() %>% rplot(shape = 15)
mtcars %>% correlate() %>% rearrange(absolute = FALSE) %>% rplot(shape = 15)
La función corrplot () del paquete corrplot R también se puede utilizar para trazar un correlograma.
library(corrplot)
M<-cor(mtcars) # compute correlation matrix
corrplot(M, method="circle")
Aquí se publican varios artículos que describen cómo calcular y visualizar la matriz de correlación:
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.
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).
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í