Tracer la matrice de corrélation dans un graphique


93

J'ai une matrice avec des valeurs de corrélation. Maintenant, je veux tracer cela dans un graphique qui ressemble plus ou moins à ça:

entrez la description de l'image ici

Comment puis-je y parvenir?


Vous trouverez peut-être cette fonction intéressante: gist.github.com/low-decarie/5886616 même si elle doit encore être améliorée ( stackoverflow.com/questions/17370853/… )
Etienne Low-Décarie

@anon pouvez-vous partager le code pour cela? c'est exactement ce que je recherche pour ma présentation
Pavlos Panteliadis

Réponses:


57

Rapide, sale et approximatif:

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

entrez la description de l'image ici


2
Cela ressemble beaucoup à l'exemple d'OP (polices, couleurs, mise en page). On dirait que l'original a également été créé avec un treillis. Excellente réponse détaillée, +1.
Marek

1
Merci pour la réponse. Beaucoup de gens sont habitués aux graphiques de corrélation dans lesquels la diagonale contenant 1-s va du carré supérieur gauche au carré inférieur droit (voir l'exemple de figure dans la question), plutôt que du carré inférieur gauche au carré supérieur droit, comme dans votre Solution. Voici comment résoudre ce problème: cor_reversed <- apply (cor, 2, rev); levelplot (t (cor_reversed), ...)
sautez le

@ bill_080 pourquoi copier-coller votre code n'imprimera pas la matrice de corrélation?
Pavlos Panteliadis

59

Ressemble plutôt "moins", mais vaut la peine d'être vérifié (car il donne plus d'informations visuelles):

Ellipses de la matrice de corrélation : les Ellipses de matrice de corrélation cercles de la matrice de corrélation : Cercles de matrice de corrélation

Veuillez trouver plus d'exemples dans la vignette corrplot référencée par @assylias ci-dessous.


1
Le site semble être obsolète. Avez-vous un code ou une description de package pour le premier tracé?
étoile brillante

1
@TrevorAlexander: Autant que je me souvienne, la première intrigue a été créée par ellipse:plotcorr.
daroczig

J'ai soumis une modification pour le lien 1 à: Improvement-visualisation.org/vis/id=250 qui fournit la même image.
russellpierce

1
Merci @rpierce, même si je n'y vois que l'image sans la source R. Que me manque-t-il ici?
daroczig


43

Très facile avec lattice :: levelplot:

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

entrez la description de l'image ici


30

La bibliothèque ggplot2 peut gérer cela avec geom_tile(). Il semble que ce graphique ci-dessus ait pu être redimensionné, car il n'y a pas de corrélations négatives, alors prenez cela en considération avec vos données. Utilisation du mtcarsjeu de données:

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

entrez la description de l'image ici

MODIFIER :

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

entrez la description de l'image ici

permet de spécifier la couleur du point médian et le blanc par défaut peut donc être un bon ajustement ici. D'autres options peuvent être trouvées sur le site Web de ggplot ici et ici .


sympa (+1)! Bien que j'ajoute une échelle de rupture manuelle (par exemple:) c(-1, -0.6, -0.3, 0, 0.3, 0.6, 1)avec "white"au milieu pour laisser les couleurs refléter la symétrie de la corrélation efficace.
daroczig

@Daroczig - Bon point. Il semble que scale_fill_gradient2()la fonctionnalité que vous décrivez soit obtenue automatiquement. Je ne savais pas que cela existait.
Chase

1
en ajoutant à ceci: p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)le rendra interactif
schlusie

Pour faire passer les diagonales 1 du haut à gauche vers le bas à droite, l'inversion des niveaux de facteur est nécessaire pour X1utiliser:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
arun

11

Utilisez le package 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")
}

Par exemple:

entrez la description de l'image ici

OMI plutôt élégante


9

Ce type de graphique est appelé une "carte thermique" entre autres termes. Une fois que vous avez votre matrice de corrélation, tracez-la à l'aide de l'un des différents didacticiels disponibles.

Utilisation des graphiques de base: http://flowingdata.com/2010/01/21/how-to-make-a-heatmap-a-quick-and-easy-solution/

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


Je ne sais pas si l'appeler une «carte thermique» est une invention assez moderne. Cela semble logique si vous essayez d'afficher les «points chauds» en utilisant un jeu de couleurs rouge-orange-jaune, mais en général, il ne s'agit que d'un tracé d'image, ou d'un tracé matriciel ou d'un tracé raster. Je serai intéressé de trouver la plus ancienne référence qui l'appelle une «carte thermique». tldr; "[la citation nécessaire]"
Spacedman

Je pense que vous avez raison, la carte thermique n'est pas nécessairement le nom le plus ancien. Wikipedia répertorie un article de 1957, mais j'ai vérifié cet article et le terme «carte thermique» n'apparaît nulle part (et les graphiques ne ressemblent pas exactement à la forme actuelle).
Ari B.Friedman

5

J'ai travaillé sur quelque chose de similaire à la visualisation publiée par @daroczig, avec du code posté par @Ulrik en utilisant la plotcorr()fonction du ellipsepackage. J'aime l'utilisation des ellipses pour représenter les corrélations et l'utilisation des couleurs pour représenter les corrélations négatives et positives. Cependant, je voulais que les couleurs accrocheuses se démarquent pour les corrélations proches de 1 et -1, pas pour celles proches de 0.

J'ai créé une alternative dans laquelle des ellipses blanches sont superposées sur des cercles colorés. Chaque ellipse blanche est dimensionnée de telle sorte que la proportion du cercle coloré visible derrière elle est égale à la corrélation au carré. Lorsque la corrélation est proche de 1 et -1, l'ellipse blanche est petite et une grande partie du cercle coloré est visible. Lorsque la corrélation est proche de 0, l'ellipse blanche est grande et une petite partie du cercle coloré est visible.

La fonction, plotcor()est disponible à l' adresse https://github.com/JVAdams/jvamisc/blob/master/R/plotcor.r .

Un exemple du graphique résultant utilisant l' mtcarsensemble de données est présenté ci-dessous.

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

résultat de l'appel à la fonction plotcor ()


3

Je me rends compte que cela fait un moment, mais les nouveaux lecteurs pourraient être intéressés rplot()par le corrrpackage ( https://cran.rstudio.com/web/packages/corrr/index.html ), qui peut produire les types de parcelles que @daroczig mentionne , mais concevoir une approche de pipeline de données:

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

entrez la description de l'image ici

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

entrez la description de l'image ici

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

entrez la description de l'image ici

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

entrez la description de l'image ici

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

entrez la description de l'image ici


2

La fonction corrplot () du package corrplot R peut également être utilisée pour tracer un corrélogramme.

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

plusieurs articles décrivant comment calculer et visualiser la matrice de corrélation sont publiés ici:


1

Une autre solution que j'ai récemment découverte est une carte thermique interactive créée avec le package qtlcharts .

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

Vous trouverez ci-dessous une image statique du graphique résultant. entrez la description de l'image ici

Vous pouvez voir la version interactive sur mon blog . Passez la souris sur la carte thermique pour voir les valeurs de ligne, de colonne et de cellule. Cliquez sur une cellule pour voir un nuage de points avec des symboles colorés par groupe (dans cet exemple, le nombre de cylindres, 4 est rouge, 6 est vert et 8 est bleu). Le survol des points du nuage de points donne le nom de la ligne (dans ce cas, la marque de la voiture).


0

Comme je ne peux pas commenter, je dois donner mon 2c à la réponse de Daroczig en guise de réponse ...

Le nuage de points ellipse est en effet issu du package ellipse et généré avec:

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

(à partir de la page de manuel)

Le paquet corrplot peut également - comme suggéré - être utile avec de jolies images trouvées ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.