Traccia la matrice di correlazione in un grafico


93

Ho una matrice con alcuni valori di correlazione. Ora voglio tracciarlo in un grafico che assomiglia più o meno a quello:

inserisci qui la descrizione dell'immagine

Come posso ottenerlo?


Potresti trovare questa funzione interessante: gist.github.com/low-decarie/5886616 sebbene debba ancora essere migliorata ( stackoverflow.com/questions/17370853/… )
Etienne Low-Décarie

@anon puoi condividere il codice per questo? questo è esattamente quello che cerco per la mia presentazione
Pavlos Panteliadis

Risposte:


57

Veloce, sporco e allo stesso modo:

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

inserisci qui la descrizione dell'immagine


2
Sembra molto simile all'esempio di OP (caratteri, colori, layout). Sembra che anche l'originale sia stato creato con il reticolo. Ottima risposta dettagliata, +1.
Marek

1
Grazie per la risposta. Molte persone sono abituate a grafici di correlazione in cui la diagonale contenente 1-s va dal quadrato in alto a sinistra a quello in basso a destra (vedi la figura di esempio nella domanda), piuttosto che dal quadrato in basso a sinistra a quello in alto a destra, come nel tuo soluzione. Ecco come risolvere questo problema: cor_reversed <- apply (cor, 2, rev); levelplot (t (cor_reversed), ...)
salta l'

@ bill_080 perché copiare e incollare il codice non stampa la matrice di correlazione?
Pavlos Panteliadis

59

Sembra piuttosto "meno", ma vale la pena controllare (dato che fornisce più informazioni visive):

Ellissi matrice di correlazione : Ellissi della matrice di correlazione cerchi delle matrici di correlazione : Cerchi della matrice di correlazione

Si prega di trovare altri esempi in vignetta corrplot a cui fa riferimento @assylias di seguito.


1
Il sito sembra essere defunto. Hai qualche codice o descrizione del pacchetto per la prima trama?
stella luminosa

1
@TrevorAlexander: Per quanto ricordo, la prima trama è stata creata da ellipse:plotcorr.
daroczig

Ho inviato una modifica per il collegamento 1 a: improvement-visualisation.org/vis/id=250 che fornisce la stessa immagine.
russellpierce

1
Grazie @rpierce, anche se vedo solo l'immagine senza la sorgente R. Cosa mi manca qui?
daroczig


43

Molto facile con lattice :: levelplot:

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

inserisci qui la descrizione dell'immagine


30

La libreria ggplot2 può gestirlo con geom_tile(). Sembra che potrebbe essere stato eseguito un ridimensionamento nel grafico sopra poiché non ci sono correlazioni negative, quindi tienilo in considerazione con i tuoi dati. Utilizzo del mtcarsset di dati:

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

inserisci qui la descrizione dell'immagine

MODIFICA :

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

inserisci qui la descrizione dell'immagine

permette di specificare il colore del punto medio e il valore predefinito è bianco, quindi potrebbe essere una bella regolazione qui. Altre opzioni possono essere trovate sul sito web di ggplot qui e qui .


bello (+1)! Anche se aggiungerei una scala di interruzione manuale (ad esempio:) c(-1, -0.6, -0.3, 0, 0.3, 0.6, 1)con "white"al centro per lasciare che i colori riflettano la simmetria della correlazione efficiente.
daroczig

@Daroczig - Buon punto. Sembra che scale_fill_gradient2()raggiunga la funzionalità che descrivi automaticamente. Non sapevo che esistesse.
Chase

1
aggiungendo a questo: p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)renderà interattivo
schlusie

Per fare in modo che la diagonale 1 vada da in alto a sinistra a in basso a destra, è necessario invertire i livelli dei fattori per X1utilizzare:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
arun

11

Usa il pacchetto 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")
}

Per esempio:

inserisci qui la descrizione dell'immagine

Piuttosto elegante IMO


9

Questo tipo di grafico è chiamato "mappa di calore" tra gli altri termini. Una volta ottenuta la matrice di correlazione, tracciarla utilizzando uno dei vari tutorial disponibili.

Utilizzo della grafica di base: http://flowingdata.com/2010/01/21/how-to-make-a-heatmap-a-quick-and-easy-solution/

Utilizzando ggplot2: http://learnr.wordpress.com/2010/01/26/ggplot2-quick-heatmap-plotting/


Non sono sicuro che definirla una "mappa di calore" sia un'invenzione abbastanza moderna. Sembra avere senso se stai cercando di mostrare i "punti caldi" usando uno schema di colori rosso-arancio-giallo, ma in generale è solo una trama dell'immagine, o una trama a matrice o una trama raster. Mi interesserà trovare il riferimento più vecchio che lo chiama "mappa di calore". tldr; "[citazione necessaria]"
Spacedman

Penso che tu abbia ragione sul fatto che la mappa di calore non è necessariamente il primo nome per esso. Wikipedia elenca un articolo del 1957, ma ho controllato quel documento e il termine "mappa di calore" non compare da nessuna parte (né la grafica sembra esattamente come la forma attuale).
Ari B. Friedman

5

Ho lavorato a qualcosa di simile alla visualizzazione pubblicata da @daroczig, con il codice pubblicato da @Ulrik utilizzando la plotcorr()funzione delellipse pacchetto. Mi piace l'uso dei puntini di sospensione per rappresentare le correlazioni e l'uso dei colori per rappresentare la correlazione negativa e positiva. Tuttavia, volevo che i colori accattivanti risaltassero per le correlazioni vicine a 1 e -1, non per quelle vicine a 0.

Ho creato un'alternativa in cui le ellissi bianche sono sovrapposte a cerchi colorati. Ogni ellisse bianca è dimensionata in modo che la proporzione del cerchio colorato visibile dietro di essa sia uguale alla correlazione al quadrato. Quando la correlazione è prossima a 1 e -1, l'ellisse bianca è piccola e gran parte del cerchio colorato è visibile. Quando la correlazione è prossima allo 0, l'ellisse bianca è grande e una piccola parte del cerchio colorato è visibile.

La funzione plotcor()è disponibile su https://github.com/JVAdams/jvamisc/blob/master/R/plotcor.r .

Di mtcarsseguito è mostrato un esempio del grafico risultante utilizzando il set di dati.

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

risultato della chiamata alla funzione plotcor ()


3

Mi rendo conto che è passato un po 'di tempo, ma i nuovi lettori potrebbero essere interessati rplot()dal corrrpacchetto ( https://cran.rstudio.com/web/packages/corrr/index.html ), che può produrre il tipo di trame menzionato da @daroczig , ma progettare per un approccio alla pipeline di dati:

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

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine


2

La funzione corrplot () dal pacchetto corrplot R può essere utilizzata anche per tracciare un correlogramma.

library(corrplot)  
M<-cor(mtcars) # compute correlation matrix
corrplot(M, method="circle")

diversi articoli che descrivono come calcolare e visualizzare la matrice di correlazione sono pubblicati qui:


1

Un'altra soluzione che ho imparato di recente è una mappa termica interattiva creata con il pacchetto qtlcharts .

install.packages("qtlcharts")
library(qtlcharts)
iplotCorr(mat=mtcars, group=mtcars$cyl, reorder=TRUE)

Di seguito è un'immagine statica della trama risultante. inserisci qui la descrizione dell'immagine

Puoi vedere la versione interattiva sul mio blog . Passa il mouse sulla mappa termica per visualizzare i valori di riga, colonna e cella. Fare clic su una cella per visualizzare un grafico a dispersione con simboli colorati per gruppo (in questo esempio, il numero di cilindri, 4 è rosso, 6 è verde e 8 è blu). Passando con il mouse sui punti dello scatterplot si ottiene il nome della riga (in questo caso la marca dell'auto).


0

Dato che non posso commentare, devo dare il mio 2c alla risposta di daroczig come risposta ...

Il grafico a dispersione dell'ellisse proviene effettivamente dal pacchetto ellipse e generato 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])

(dalla pagina man)

Il pacchetto corrplot può anche, come suggerito, essere utile con belle immagini trovate qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.