Zeichnen Sie die Korrelationsmatrix in ein Diagramm


93

Ich habe eine Matrix mit einigen Korrelationswerten. Jetzt möchte ich das in einem Diagramm darstellen, das mehr oder weniger so aussieht:

Geben Sie hier die Bildbeschreibung ein

Wie kann ich das erreichen?


Diese Funktion könnte für Sie interessant sein: gist.github.com/low-decarie/5886616, obwohl sie noch verbessert werden muss ( stackoverflow.com/questions/17370853/… )
Etienne Low-Décarie

@anon kannst du den Code dafür teilen? Das ist genau das, wonach ich für meine Präsentation suche
Pavlos Panteliadis

Antworten:


57

Schnell, dreckig und im Stadion:

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

Geben Sie hier die Bildbeschreibung ein


2
Es sieht dem Beispiel von OP (Schriftarten, Farben, Layout) sehr ähnlich. Es sieht so aus, als ob das Original auch mit Gitter erstellt wurde. Tolle detaillierte Antwort, +1.
Marek

1
Danke für die Antwort. Viele Menschen sind an Korrelationsdiagramme gewöhnt, bei denen die Diagonale mit 1-s vom oberen linken zum unteren rechten Quadrat verläuft (siehe Beispielbeispiel in der Frage) und nicht wie bei Ihrem von links unten zum oberen rechten Quadrat Lösung. So beheben Sie dieses Problem: cor_reversed <- apply (cor, 2, rev); Levelplot (t (cor_reversed), ...)
überspringen Sie den

@ bill_080 Warum wird beim Kopieren und Einfügen Ihres Codes die Korrelationsmatrix nicht gedruckt?
Pavlos Panteliadis

59

Eher "weniger" aussehen, aber es lohnt sich zu überprüfen (um mehr visuelle Informationen zu geben):

Korrelationsmatrixellipsen : Korrelationsmatrix-Ellipsen Korrelationsmatrixkreise : Korrelationsmatrixkreise

Weitere Beispiele finden Sie in der Corrplot-Vignette, auf die @assylias unten verweist.


1
Die Seite scheint nicht mehr vorhanden zu sein. Haben Sie einen Code oder eine Paketbeschreibung für das erste Grundstück?
Heller Stern

1
@ TrevorAlexander: Soweit ich mich erinnere, wurde die erste Handlung von erstellt ellipse:plotcorr.
Daroczig

Ich habe eine Bearbeitung für Link 1 an folgende Adresse gesendet : Improvement-visualisation.org/vis/id=250, die das gleiche Bild liefert.
Russellpierce

1
Vielen Dank an @rpierce, obwohl ich dort nur das Bild ohne die R-Quelle sehe. Was vermisse ich hier?
Daroczig


43

Sehr einfach mit lattice :: levelplot:

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

Geben Sie hier die Bildbeschreibung ein


30

Die ggplot2-Bibliothek kann damit umgehen geom_tile(). Es sieht so aus, als ob in der obigen Darstellung möglicherweise eine Neuskalierung durchgeführt wurde, da keine negativen Korrelationen vorliegen. Berücksichtigen Sie dies bei Ihren Daten. Verwenden des mtcarsDatensatzes:

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

Geben Sie hier die Bildbeschreibung ein

EDIT :

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

Geben Sie hier die Bildbeschreibung ein

Ermöglicht die Angabe der Farbe des Mittelpunkts und standardmäßig Weiß. Dies kann hier eine gute Anpassung sein. Weitere Optionen finden Sie hier und hier auf der ggplot-Website .


schön (+1)! Obwohl ich eine manuelle Unterbrechungsskala (z. B. :) c(-1, -0.6, -0.3, 0, 0.3, 0.6, 1)mit "white"in der Mitte hinzufügen würde , damit die Farben die Symmetrie der Korrelationseffizienz widerspiegeln.
Daroczig

@Daroczig - Guter Punkt. Es sieht so aus, als würde scale_fill_gradient2()die von Ihnen beschriebene Funktionalität automatisch erreicht. Ich wusste nicht, dass es das gibt.
Chase

1
p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)
Hinzu kommt

Damit die diagonalen X1z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
Einsen

11

Verwenden Sie das Corrplot-Paket:

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

Beispielsweise:

Geben Sie hier die Bildbeschreibung ein

Eher elegante IMO


9

Diese Art von Grafik wird unter anderem als "Wärmekarte" bezeichnet. Sobald Sie Ihre Korrelationsmatrix erhalten haben, zeichnen Sie sie mithilfe eines der verschiedenen Tutorials auf.

Verwenden von Basisgrafiken: http://flowingdata.com/2010/01/21/how-to-make-a-heatmap-a-quick-and-easy-solution/

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


Ich bin mir nicht sicher, ob es eine ziemlich moderne Erfindung ist, es als "Heatmap" zu bezeichnen. Es scheint sinnvoll zu sein, wenn Sie versuchen, "Hotspots" mithilfe eines rot-orange-gelben Farbschemas anzuzeigen. Im Allgemeinen handelt es sich jedoch nur um ein Bilddiagramm, ein Matrixdiagramm oder ein Rasterdiagramm. Ich werde interessiert sein, die älteste Referenz zu finden, die es eine "Heatmap" nennt. tldr; "[Zitat benötigt]"
Spacedman

Ich denke, Sie haben Recht, dass Heatmap nicht unbedingt der früheste Name dafür ist. Wikipedia listet ein Papier von 1957 auf, aber ich habe dieses Papier überprüft und der Begriff "Heatmap" erscheint nirgends darin (und die Grafiken sehen auch nicht genau wie das aktuelle Formular aus).
Ari B. Friedman

5

Ich habe an etwas ähnlichem gearbeitet wie der von @daroczig geposteten Visualisierung, wobei der von @Ulrik gepostete Code die plotcorr()Funktion des ellipsePakets verwendet. Ich mag die Verwendung von Ellipsen zur Darstellung von Korrelationen und die Verwendung von Farben zur Darstellung von negativen und positiven Korrelationen. Ich wollte jedoch, dass die auffälligen Farben für Korrelationen nahe 1 und -1 auffallen, nicht für solche nahe 0.

Ich habe eine Alternative geschaffen, bei der weiße Ellipsen farbigen Kreisen überlagert werden. Jede weiße Ellipse ist so bemessen, dass der Anteil des dahinter sichtbaren farbigen Kreises gleich der quadratischen Korrelation ist. Wenn die Korrelation nahe 1 und -1 liegt, ist die weiße Ellipse klein und ein Großteil des farbigen Kreises ist sichtbar. Wenn die Korrelation nahe 0 ist, ist die weiße Ellipse groß und wenig des farbigen Kreises ist sichtbar.

Die Funktion plotcor()ist unter https://github.com/JVAdams/jvamisc/blob/master/R/plotcor.r verfügbar .

Ein Beispiel für das resultierende Diagramm unter Verwendung des mtcarsDatensatzes ist unten gezeigt.

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

Ergebnis des Aufrufs der Funktion plotcor ()


3

Mir ist klar, dass es eine Weile her ist, aber neue Leser könnten an rplot()dem corrrPaket ( https://cran.rstudio.com/web/packages/corrr/index.html ) interessiert sein , das die Art von Plots hervorbringen kann, die @daroczig erwähnt , aber Entwurf für einen Datenpipeline-Ansatz:

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

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein


2

Die Funktion corrplot () aus dem Paket corrplot R kann auch zum Zeichnen eines Korrelogramms verwendet werden.

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

Hier werden mehrere Artikel veröffentlicht, die beschreiben, wie die Korrelationsmatrix berechnet und visualisiert wird:


1

Eine andere Lösung, die ich kürzlich kennengelernt habe, ist eine interaktive Heatmap, die mit dem qtlcharts- Paket erstellt wurde.

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

Unten sehen Sie ein statisches Bild des resultierenden Diagramms. Geben Sie hier die Bildbeschreibung ein

Sie können die interaktive Version auf meinem Blog sehen . Bewegen Sie den Mauszeiger über die Heatmap, um die Werte für Zeilen, Spalten und Zellen anzuzeigen. Klicken Sie auf eine Zelle, um ein Streudiagramm mit nach Gruppen gefärbten Symbolen anzuzeigen (in diesem Beispiel ist die Anzahl der Zylinder, 4 ist rot, 6 ist grün und 8 ist blau). Wenn Sie mit der Maus über die Punkte im Streudiagramm fahren, wird der Name der Zeile angezeigt (in diesem Fall die Marke des Fahrzeugs).


0

Da ich nicht kommentieren kann, muss ich meine 2c auf die Antwort von daroczig als Antwort geben ...

Das Ellipsenstreudiagramm stammt tatsächlich aus dem Ellipsenpaket und wird generiert mit:

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

(von der Manpage)

Das Corrplot-Paket kann auch - wie vorgeschlagen - bei hübschen Bildern nützlich sein, die hier zu finden sind

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.