Eu tenho uma matriz com alguns valores de correlação. Agora eu quero plotar isso em um gráfico que se parece mais ou menos assim:
Como posso conseguir isso?
Eu tenho uma matriz com alguns valores de correlação. Agora eu quero plotar isso em um gráfico que se parece mais ou menos assim:
Como posso conseguir isso?
Respostas:
Rápido, sujo e no estádio:
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))
Parece "menos", mas vale a pena verificar (já que fornece mais informações visuais):
Elipses matriz de correlação : círculos matriz de correlação :
Encontre mais exemplos na vinheta corrplot referenciada por @assylias abaixo.
ellipse:plotcorr
.
A biblioteca ggplot2 pode lidar com isso geom_tile()
. Parece que pode ter havido algum reescalonamento no gráfico acima, pois não há correlações negativas, então leve isso em consideração com seus dados. Usando o mtcars
conjunto de dados:
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 a cor do ponto médio e o padrão é branco, então pode ser um bom ajuste aqui. Outras opções podem ser encontradas no site do ggplot aqui e aqui .
c(-1, -0.6, -0.3, 0, 0.3, 0.6, 1)
:) com "white"
no meio para permitir que as cores refletissem a simetria da correlação eficiente.
scale_fill_gradient2()
atinge a funcionalidade que você descreve automaticamente. Eu não sabia que isso existia.
p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)
tornará interativo
X1
usar:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
Use o pacote 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 exemplo:
Bastante elegante IMO
Esse tipo de gráfico é chamado de "mapa de calor", entre outros termos. Depois de obter sua matriz de correlação, plote-a usando um dos vários tutoriais disponíveis.
Usando gráficos básicos: 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/
Tenho trabalhado em algo semelhante à visualização postada por @daroczig, com código postado por @Ulrik usando a plotcorr()
função do ellipse
pacote. Gosto do uso de elipses para representar correlações e do uso de cores para representar correlação negativa e positiva. No entanto, eu queria que as cores atraentes se destacassem nas correlações próximas a 1 e -1, não nas próximas a 0.
Eu criei uma alternativa em que elipses brancas são sobrepostas em círculos coloridos. Cada elipse branca é dimensionada de forma que a proporção do círculo colorido visível atrás dela seja igual à correlação quadrada. Quando a correlação está próxima de 1 e -1, a elipse branca é pequena e grande parte do círculo colorido fica visível. Quando a correlação está próxima de 0, a elipse branca é grande e pouco do círculo colorido fica visível.
A função ,,plotcor()
está disponível em https://github.com/JVAdams/jvamisc/blob/master/R/plotcor.r .
Um exemplo do gráfico resultante usando o mtcars
conjunto de dados é mostrado abaixo.
library(plotrix)
library(seriation)
library(MASS)
plotcor(cor(mtcars), mar=c(0.1, 4, 4, 0.1))
Percebi que já faz um tempo, mas novos leitores podem se interessar rplot()
pelo corrr
pacote ( https://cran.rstudio.com/web/packages/corrr/index.html ), que pode produzir os tipos de gráficos que @daroczig menciona , mas projetar para uma abordagem de pipeline de dados:
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)
A função corrplot () do pacote corrplot R também pode ser usada para plotar um correlograma.
library(corrplot)
M<-cor(mtcars) # compute correlation matrix
corrplot(M, method="circle")
vários artigos que descrevem como calcular e visualizar a matriz de correlação são publicados aqui:
Outra solução que aprendi recentemente é um mapa de calor interativo criado com o pacote qtlcharts .
install.packages("qtlcharts")
library(qtlcharts)
iplotCorr(mat=mtcars, group=mtcars$cyl, reorder=TRUE)
Abaixo está uma imagem estática do gráfico resultante.
Você pode ver a versão interativa no meu blog . Passe o mouse sobre o mapa de calor para ver os valores de linha, coluna e célula. Clique em uma célula para ver um gráfico de dispersão com símbolos coloridos por grupo (neste exemplo, o número de cilindros, 4 é vermelho, 6 é verde e 8 é azul). Passar o mouse sobre os pontos no gráfico de dispersão fornece o nome da linha (neste caso, a marca do carro).
Como não posso comentar, tenho que dar o meu 2c à resposta de daroczig como uma resposta ...
O gráfico de dispersão da elipse é de fato do pacote da elipse e gerado com:
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])
(da página de manual)
O pacote corrplot também pode - como sugerido - ser útil com imagens bonitas encontradas aqui