Traçar a matriz de correlação em um gráfico


93

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:

insira a descrição da imagem aqui

Como posso conseguir isso?


Você pode achar esta função interessante: gist.github.com/low-decarie/5886616 embora ela ainda precise ser melhorada ( stackoverflow.com/questions/17370853/… )
Etienne Low-Décarie

@anon você pode compartilhar o código para isso? isto é exatamente o que procuro para minha apresentação
Pavlos Panteliadis

Respostas:


57

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))

insira a descrição da imagem aqui


2
É 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):

Elipses matriz de correlação : Elipses de matriz de correlação círculos matriz de correlação : Círculos de matriz de correlação

Encontre mais exemplos na vinheta corrplot referenciada por @assylias abaixo.


1
O site parece estar extinto. Você tem algum código ou descrição de pacote para o primeiro lote?
estrela brilhante

1
@TrevorAlexander: Pelo que me lembro, o primeiro enredo foi criado por ellipse:plotcorr.
daroczig,

Enviei uma edição para o link 1 para: improvement-visualisation.org/vis/id=250 que fornece a mesma imagem.
russellpierce

1
Obrigado @rpierce, embora eu veja apenas a imagem lá sem a fonte R. O que eu sinto falta aqui?
daroczig


43

Muito fácil com lattice :: levelplot:

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

insira a descrição da imagem aqui


30

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")

insira a descrição da imagem aqui

EDITAR :

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

insira a descrição da imagem aqui

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")
}

Por exemplo:

insira a descrição da imagem aqui

Bastante elegante IMO


9

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/


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.

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 mtcarsconjunto de dados é mostrado abaixo.

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

resultado da chamada à função plotcor ()


3

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:

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

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui



1

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. insira a descrição da imagem aqui

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).


0

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.