Przedstaw macierz korelacji na wykresie


93

Mam macierz z pewnymi wartościami korelacji. Teraz chcę to wykreślić na wykresie, który wygląda mniej więcej tak:

wprowadź opis obrazu tutaj

Jak mogę to osiągnąć?


Ta funkcja może być interesująca: gist.github.com/low-decarie/5886616, chociaż nadal wymaga ulepszenia ( stackoverflow.com/questions/17370853/ ... )
Etienne Low-Décarie

@anon, czy możesz udostępnić kod? właśnie tego szukam do mojej prezentacji
Pavlos Panteliadis

Odpowiedzi:


57

Szybko, brudno i na boisku:

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

wprowadź opis obrazu tutaj


2
Wygląda bardzo podobnie do przykładu z OP (czcionki, kolory, układ). Wygląda na to, że oryginał też został stworzony z kratą. Świetna szczegółowa odpowiedź, +1.
Marek

1
Dziękuję za Twoją odpowiedź. Wiele osób jest przyzwyczajonych do wykresów korelacyjnych, na których przekątna zawierająca 1-s biegnie od lewego górnego do prawego dolnego kwadratu (patrz przykładowy rysunek w pytaniu), a nie od lewego dolnego do prawego górnego kwadratu, jak w twoim rozwiązanie. Oto jak rozwiązać ten problem: cor_reversed <- apply (cor, 2, rev); levelplot (t (cor_reversed), ...)
pomiń

@ bill_080 dlaczego kopiowanie i wklejanie kodu nie spowoduje wydrukowania macierzy korelacji?
Pavlos Panteliadis

59

Wygląda raczej „mniej”, ale warto sprawdzić (podając więcej informacji wizualnych):

Elipsy macierzy korelacji : Elipsy macierzy korelacji koła matrycowe związek : Okręgi macierzy korelacji

Więcej przykładów można znaleźć w winiecie corrplot, do której odwołuje się @assylias poniżej.


1
Witryna wygląda na nieistniejącą. Czy masz kod lub opis pakietu dla pierwszej działki?
jasna gwiazda

1
@TrevorAlexander: O ile pamiętam, pierwszą fabułę stworzył ellipse:plotcorr.
daroczig

Przesłałem edycję dla linku 1 na adres: improvement-visualisation.org/vis/id=250, która zawiera ten sam obraz.
russellpierce

1
Dziękuję @rpierce, chociaż widzę tam tylko obraz bez źródła R. Czego tu brakuje?
daroczig


43

Bardzo łatwe z kratownicą :: Levelplot:

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

wprowadź opis obrazu tutaj


30

Biblioteka ggplot2 może sobie z tym poradzić z geom_tile(). Wygląda na to, że na powyższym wykresie mogło zostać dokonane przeskalowanie, ponieważ nie ma żadnych negatywnych korelacji, więc weź to pod uwagę w swoich danych. Korzystanie ze mtcarszbioru danych:

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

wprowadź opis obrazu tutaj

EDYCJA :

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

wprowadź opis obrazu tutaj

pozwala określić kolor punktu środkowego i domyślnie jest biały, więc może być tutaj fajnym dopasowaniem. Inne opcje można znaleźć na stronie ggplot tutaj i tutaj .


fajnie (+1)! Chociaż dodałbym ręczną skalę podziału (np. c(-1, -0.6, -0.3, 0, 0.3, 0.6, 1):) ze "white"środkiem, aby kolory odzwierciedlały symetrię korelacji wydajnej.
daroczig

@Daroczig - Słuszna uwaga. Wygląda scale_fill_gradient2()na to, że automatycznie uzyskuje opisaną przez Ciebie funkcjonalność. Nie wiedziałem, że istnieje.
Chase

1
dodając do tego: p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)uczyni to interaktywnym
schlusie

Aby ukośne 1-iść od góry lewej do prawej dolnej, odwrócenie poziomów czynnika wymagana jest X1przy użyciu:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
arun

12

Użyj pakietu 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")
}

Na przykład:

wprowadź opis obrazu tutaj

Raczej elegancki IMO


9

Ten typ wykresu nazywany jest między innymi „mapą cieplną”. Gdy masz już macierz korelacji, wykreśl ją za pomocą jednego z różnych samouczków.

Korzystanie z grafiki bazowej: http://flowingdata.com/2010/01/21/how-to-make-a-heatmap-a-quick-and-easy-solution/

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


Nie jestem pewien, czy nazwanie tego „mapą cieplną” to dość nowoczesny wynalazek. Wydaje się, że ma to sens, jeśli próbujesz pokazać „punkty aktywne” za pomocą czerwono-pomarańczowo-żółtego schematu kolorów, ale ogólnie jest to tylko wykres obrazu, wykres macierzowy lub wykres rastrowy. Będę zainteresowany znalezieniem najstarszej wzmianki, która nazywa ją „mapą cieplną”. tldr; „[potrzebne źródło]”
Spacedman

Myślę, że masz rację, że mapa ciepła niekoniecznie jest jej najwcześniejszą nazwą. Wikipedia wymienia artykuł z 1957 roku, ale sprawdziłem, czy ten artykuł i termin „mapa ciepła” nigdzie się w nim nie pojawia (ani grafika nie wygląda dokładnie tak, jak w obecnej formie).
Ari B. Friedman

5

Pracowałem nad czymś podobnym do wizualizacji opublikowanej przez @daroczig, z kodem przesłanym przez @Ulrik za pomocą plotcorr()funkcji ellipsepakietu. Podoba mi się używanie elips do przedstawiania korelacji oraz używanie kolorów do przedstawiania korelacji ujemnej i dodatniej. Jednak chciałem, aby przyciągające wzrok kolory wyróżniały się dla korelacji bliskich 1 i -1, a nie dla tych bliskich 0.

Stworzyłem alternatywę, w której białe elipsy są nałożone na kolorowe koła. Każda biała elipsa jest tak zwymiarowana, że ​​proporcja kolorowego koła widocznego za nią jest równa kwadratowej korelacji. Kiedy korelacja jest bliska 1 i -1, biała elipsa jest mała i widoczna jest większość kolorowego koła. Kiedy korelacja jest bliska 0, biała elipsa jest duża i widoczna jest niewielka część kolorowego koła.

Funkcja,, plotcor()jest dostępna pod adresem https://github.com/JVAdams/jvamisc/blob/master/R/plotcor.r .

Przykład wynikowego wykresu przy użyciu mtcarszestawu danych przedstawiono poniżej.

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

wynik wywołania funkcji plotcor ()


3

Zdaję sobie sprawę, że minęło trochę czasu, ale nowi czytelnicy mogą być zainteresowani rplot()z corrrpakietu ( https://cran.rstudio.com/web/packages/corrr/index.html ), który może wytwarzać rodzaje działek @daroczig wspomina , ale zaprojektuj podejście do potoku danych:

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

wprowadź opis obrazu tutaj

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

wprowadź opis obrazu tutaj

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

wprowadź opis obrazu tutaj

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

wprowadź opis obrazu tutaj

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

wprowadź opis obrazu tutaj


2

Corrplot () funkcję z corrplot pakiecie R można również wykorzystać do wykreślenia korelogram.

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

kilka artykułów opisujących sposób obliczania i wizualizacji macierzy korelacji zostało opublikowanych tutaj:


1

Innym rozwiązaniem, o którym niedawno się dowiedziałem, jest interaktywna mapa ciepła utworzona za pomocą pakietu qtlcharts .

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

Poniżej znajduje się statyczny obraz powstałej fabuły. wprowadź opis obrazu tutaj

Możesz zobaczyć interaktywną wersję na moim blogu . Umieść wskaźnik myszy na mapie termicznej, aby wyświetlić wartości wiersza, kolumny i komórki. Kliknij komórkę, aby zobaczyć wykres rozrzutu z symbolami pokolorowanymi według grup (w tym przykładzie liczba cylindrów 4 jest czerwona, 6 jest zielona, ​​a 8 niebieska). Najechanie kursorem na punkty na wykresie rozrzutu powoduje wyświetlenie nazwy wiersza (w tym przypadku marki samochodu).


0

Ponieważ nie mogę komentować, muszę dać moje 2c na odpowiedź daroczig jako odpowiedź ...

Wykres punktowy elipsy faktycznie pochodzi z pakietu elipsy i został wygenerowany za pomocą:

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

(ze strony podręcznika)

Pakiet corrplot może również - zgodnie z sugestią - być przydatny w przypadku ładnych obrazków, które znajdują się tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.