É muito semelhante ao exemplo do OP (fontes, cores, layout). Parece que o original também foi criado com estrutura. Ótima resposta detalhada, +1.
Marek,
1
Obrigado pela resposta. Muitas pessoas estão acostumadas a gráficos de correlação em que a diagonal contendo 1-s corre do canto superior esquerdo para o quadrado inferior direito (veja a figura de exemplo na pergunta), em vez de do canto inferior esquerdo para o quadrado superior direito, como em seu solução. Veja como corrigir esse problema: cor_reversed <- apply (cor, 2, rev); levelplot (t (cor_reversed), ...)
pular
@ bill_080 por que copiar e colar seu código não imprime a matriz de correlação?
Pavlos Panteliadis
59
Parece "menos", mas vale a pena verificar (já que fornece mais informações visuais):
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 mtcarsconjunto 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 .
legal (+1)! Embora eu adicionasse uma escala de quebra manual (por exemplo 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.
daroczig,
@Daroczig - Bom ponto. Parece que scale_fill_gradient2()atinge a funcionalidade que você descreve automaticamente. Eu não sabia que isso existia.
Chase
1
adicionando a isso: p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)tornará interativo
schlusie
Para fazer com que a diagonal de 1 vá do canto superior esquerdo para o canto inferior direito, a reversão dos níveis dos fatores é necessária para X1usar:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
arun
11
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")}
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.
Não tenho certeza se chamá-lo de 'mapa de calor' é uma invenção bastante moderna. Parece fazer sentido se você está tentando mostrar 'pontos ativos' usando um esquema de cores vermelho-laranja-amarelo, mas em geral é apenas um gráfico de imagem, um gráfico de matriz ou um gráfico raster. Terei interesse em encontrar a referência mais antiga que a chama de 'mapa de calor'. tldr; "[carece de fontes]"
Spacedman
Acho que você está certo de que mapa de calor não é necessariamente o nome mais antigo para ele. A Wikipedia lista um artigo de 1957, mas eu verifiquei esse artigo e o termo "mapa de calor" não aparece em nenhum lugar dele (nem os gráficos parecem exatamente com a forma atual).
Ari B. Friedman
5
Tenho trabalhado em algo semelhante à visualização postada por @daroczig, com código postado por @Ulrik usando a plotcorr()função do ellipsepacote. 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.
Percebi que já faz um tempo, mas novos leitores podem se interessar rplot()pelo corrrpacote ( 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:
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).
Respostas:
Rápido, sujo e no estádio:
fonte
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.
fonte
ellipse:plotcorr
.Muito fácil com lattice :: levelplot:
fonte
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 omtcars
conjunto de dados:EDITAR :
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 .
fonte
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á interativoX1
usar:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
Use o pacote corrplot:
Por exemplo:
Bastante elegante IMO
fonte
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/
fonte
Tenho trabalhado em algo semelhante à visualização postada por @daroczig, com código postado por @Ulrik usando a
plotcorr()
função doellipse
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.fonte
Percebi que já faz um tempo, mas novos leitores podem se interessar
rplot()
pelocorrr
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:fonte
A função corrplot () do pacote corrplot R também pode ser usada para plotar um correlograma.
vários artigos que descrevem como calcular e visualizar a matriz de correlação são publicados aqui:
fonte
Outra solução que aprendi recentemente é um mapa de calor interativo criado com o pacote qtlcharts .
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).
fonte
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:
(da página de manual)
O pacote corrplot também pode - como sugerido - ser útil com imagens bonitas encontradas aqui
fonte