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):
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")
EDYCJA :
ggplot(z.m, aes(X1, X2, fill = value)) + geom_tile() +
scale_fill_gradient2(low = "blue", high = "yellow")
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")
}
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.
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:
Poniżej znajduje się statyczny obraz powstałej fabuły.
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).
Odpowiedzi:
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))
źródło
Wygląda raczej „mniej”, ale warto sprawdzić (podając więcej informacji wizualnych):
Elipsy macierzy korelacji : koła matrycowe związek :
Więcej przykładów można znaleźć w winiecie corrplot, do której odwołuje się @assylias poniżej.
źródło
ellipse:plotcorr
.Bardzo łatwe z kratownicą :: Levelplot:
z <- cor(mtcars) require(lattice) levelplot(z)
źródło
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 zemtcars
zbioru 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")
EDYCJA :
ggplot(z.m, aes(X1, X2, fill = value)) + geom_tile() + scale_fill_gradient2(low = "blue", high = "yellow")
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 .
źródło
c(-1, -0.6, -0.3, 0, 0.3, 0.6, 1)
:) ze"white"
środkiem, aby kolory odzwierciedlały symetrię korelacji wydajnej.scale_fill_gradient2()
na to, że automatycznie uzyskuje opisaną przez Ciebie funkcjonalność. Nie wiedziałem, że istnieje.p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)
uczyni to interaktywnymX1
przy użyciu:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
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:
Raczej elegancki IMO
źródło
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/
źródło
Pracowałem nad czymś podobnym do wizualizacji opublikowanej przez @daroczig, z kodem przesłanym przez @Ulrik za pomocą
plotcorr()
funkcjiellipse
pakietu. 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
mtcars
zestawu danych przedstawiono poniżej.library(plotrix) library(seriation) library(MASS) plotcor(cor(mtcars), mar=c(0.1, 4, 4, 0.1))
źródło
Zdaję sobie sprawę, że minęło trochę czasu, ale nowi czytelnicy mogą być zainteresowani
rplot()
zcorrr
pakietu ( 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()
mtcars %>% correlate() %>% rearrange() %>% rplot(shape = 15)
mtcars %>% correlate() %>% rearrange() %>% shave() %>% rplot(shape = 15)
mtcars %>% correlate() %>% rearrange(absolute = FALSE) %>% rplot(shape = 15)
źródło
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:
źródło
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.
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).
źródło
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
źródło