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):
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")
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í .
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")}
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.
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.
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:
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).
Respuestas:
Rápido, sucio y en el estadio:
fuente
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.
fuente
ellipse:plotcorr
.Muy fácil con lattice :: levelplot:
fuente
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 elmtcars
conjunto de datos:EDITAR :
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í .
fuente
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á interactivoX1
usar:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
Utilice el paquete corrplot:
Por ejemplo:
Bastante elegante en mi opinión
fuente
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/
fuente
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.fuente
Me doy cuenta de que ha pasado un tiempo, pero los nuevos lectores podrían estar interesados en
rplot()
elcorrr
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:fuente
La función corrplot () del paquete corrplot R también se puede utilizar para trazar un correlograma.
Aquí se publican varios artículos que describen cómo calcular y visualizar la matriz de correlación:
fuente
Otra solución que aprendí recientemente es un mapa de calor interactivo creado con el paquete qtlcharts .
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).
fuente
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:
(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í
fuente