Korelasyon matrisini bir grafiğe çizin


93

Bazı korelasyon değerlerine sahip bir matrisim var. Şimdi bunu aşağı yukarı böyle görünen bir grafikte çizmek istiyorum:

görüntü açıklamasını buraya girin

Bunu nasıl başarabilirim?


Bu işlevi ilginç bulabilirsiniz: gist.github.com/low-decarie/5886616, ancak yine de iyileştirilmesi gerekiyor ( stackoverflow.com/questions/17370853/… )
Etienne Low-Décarie

@anon bunun kodunu paylaşabilir misin? sunumum için tam olarak aradığım şey bu
Pavlos Panteliadis

Yanıtlar:


57

Hızlı, kirli ve sahada:

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

görüntü açıklamasını buraya girin


2
OP'deki örneğe çok benziyor (yazı tipleri, renkler, düzen). Görünüşe göre orijinal de kafes ile oluşturulmuş. Harika ayrıntılı cevap, +1.
Marek

1
Cevap için teşekkür ederim. Pek çok insan, 1-s içeren köşegenin, sol alttan sağ üst kareden ziyade, sol üstten sağ alt kareye (sorudaki örnek şekle bakın) ilerlediği korelasyon çizimlerine alışkındır. çözüm. Bu sorunu şu şekilde çözebilirsiniz: cor_reversed <- apply (cor, 2, rev); levelplot (t (cor_reversed), ...)
atla

@ bill_080 neden kodunuzu kopyalayıp yapıştırmak korelasyon matrisini yazdırmıyor?
Pavlos Panteliadis

59

Daha ziyade "daha az" görünür, ancak kontrol etmeye değer (daha fazla görsel bilgi olarak):

Korelasyon matrisi elipsleri : Korelasyon matrisi elipsleri Korelasyon matris daireleri : Korelasyon matris çemberleri

Aşağıdaki @assylias tarafından atıfta bulunulan düzeltme vinyetinde lütfen daha fazla örnek bulun .


1
Site feshedilmiş gibi görünüyor. İlk arsa için herhangi bir kod veya paket tanımınız var mı?
parlak yıldız

1
@TrevorAlexander: Hatırladığım kadarıyla ilk olay örgüsü tarafından yaratıldı ellipse:plotcorr.
daroczig

Aynı görüntüyü sağlayan 1. bağlantı için: iyileştirme- visualisation.org/vis/id=250 için bir düzenleme gönderdim .
russellpierce

1
Teşekkür ederim @rpierce, ancak orada sadece R kaynağı olmadan görüntüyü görmeme rağmen. Burada neyi özlüyorum?
daroczig


43

Lattice :: levelplot ile çok kolay:

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

görüntü açıklamasını buraya girin


30

Ggplot2 kütüphanesi bunun üstesinden gelebilir geom_tile(). Görünüşe göre, yukarıdaki grafikte herhangi bir negatif korelasyon olmadığı için bazı yeniden ölçeklendirme yapılmış olabilir, bu yüzden verilerinizle bunu dikkate alın. mtcarsVeri kümesini kullanma :

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

görüntü açıklamasını buraya girin

DÜZENLE :

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

görüntü açıklamasını buraya girin

orta noktanın rengini belirlemeye izin verir ve varsayılan olarak beyazdır, bu yüzden burada güzel bir ayarlama olabilir. Diğer seçenekler ggplot web sitesinde burada ve burada bulunabilir .


güzel (+1)! (Örn: Ne zaman manuel-break ölçeğini eklersiniz rağmen c(-1, -0.6, -0.3, 0, 0.3, 0.6, 1)) ile "white"izin ortada renkler verimli korelasyonun simetriyi yansıtır.
daroczig

@Daroczig - İyi nokta. scale_fill_gradient2()Otomatik olarak tanımladığınız işlevselliğe ulaşıyor gibi görünüyor . Bunun var olduğunu bilmiyordum.
Chase

1
Bu ekleyerek: p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)o interaktif hale getirecek
schlusie

Köşegen X1z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
1'lerin

12

Corrplot paketini kullanın:

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

Örneğin:

görüntü açıklamasını buraya girin

Oldukça zarif IMO


9

Bu tür grafiğe diğer terimler arasında "ısı haritası" denir. Korelasyon matrisinizi aldıktan sonra, oradaki çeşitli öğreticilerden birini kullanarak onu çizin.

Temel grafikleri kullanma: http://flowingdata.com/2010/01/21/how-to-make-a-heatmap-a-quick-and-easy-solution/

Ggplot2'yi kullanma: http://learnr.wordpress.com/2010/01/26/ggplot2-quick-heatmap-plotting/


Ona 'ısı haritası' demenin oldukça modern bir icat olup olmadığından emin değilim. Kırmızı-turuncu-sarı renk şeması kullanarak 'sıcak noktaları' göstermeye çalışıyorsanız, ancak genel olarak bu sadece bir görüntü grafiği, bir matris grafiği veya bir raster grafiği kullanarak mantıklı görünüyor. Ona 'ısı haritası' diyen en eski referansı bulmakla ilgileneceğim. tldr; "[alıntı gerekli]"
Spacedman

Haklısınız, ısı haritasının ille de bunun en eski adı olmadığı. Wikipedia 1957 tarihli bir makaleyi listeliyor, ancak o kağıdı kontrol ettim ve "ısı haritası" terimi hiçbir yerde görünmüyor (ya da grafikler tam olarak şu anki forma benzemiyor).
Ari B. Friedman

5

Paketin plotcorr()işlevini kullanarak @ Ulrik tarafından gönderilen kodla, @daroczig tarafından yayınlanan görselleştirmeye benzer bir şey üzerinde çalışıyorum ellipse. Korelasyonları temsil etmek için elips kullanılmasını ve negatif ve pozitif korelasyonu temsil etmek için renklerin kullanılmasını seviyorum. Bununla birlikte, göz alıcı renklerin 0'a yakın olanlar için değil, 1 ve -1'e yakın korelasyonlar için öne çıkmasını istedim.

Beyaz elipslerin renkli dairelerin üzerine yerleştirildiği bir alternatif yarattım. Her bir beyaz elips, arkasında görünen renkli dairenin oranının korelasyonun karesine eşit olacağı şekilde boyutlandırılmıştır. Korelasyon 1 ve -1'e yakın olduğunda, beyaz elips küçüktür ve renkli dairenin çoğu görülebilir. Korelasyon 0'a yakın olduğunda, beyaz elips büyüktür ve renkli dairenin çok azı görülebilir.

İşlev, https://github.com/JVAdams/jvamisc/blob/master/R/plotcor.r adresindeplotcor() mevcuttur .

mtcarsVeri kümesini kullanarak elde edilen grafiğin bir örneği aşağıda gösterilmiştir.

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

plotcor () işlevine yapılan çağrının sonucu


3

Bunun bir süre oldu fark, ancak yeni okuyucular ilgilenen olabilir rplot()dan corrrpaketi ( https://cran.rstudio.com/web/packages/corrr/index.html bahseder @daroczig parsellerin türlü üretebilir), , ancak bir veri hattı yaklaşımı için tasarım:

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

görüntü açıklamasını buraya girin

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

görüntü açıklamasını buraya girin

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

görüntü açıklamasını buraya girin

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

görüntü açıklamasını buraya girin

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

görüntü açıklamasını buraya girin


2

Corrplot () gelen işlevi corrplot R paketin da korelogram çizmek için kullanılabilmektedir.

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

korelasyon matrisinin nasıl hesaplanacağını ve görselleştirileceğini açıklayan birkaç makale burada yayınlanmıştır:


1

Yakın zamanda öğrendiğim bir başka çözüm de qtlcharts paketiyle oluşturulan etkileşimli bir ısı haritası .

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

Aşağıda ortaya çıkan grafiğin statik bir görüntüsü verilmiştir. görüntü açıklamasını buraya girin

Etkileşimli versiyonu blogumda görebilirsiniz . Satır, sütun ve hücre değerlerini görmek için ısı haritasının üzerine gelin. Gruba göre renklendirilmiş semboller içeren dağılım grafiğini görmek için bir hücreye tıklayın (bu örnekte, silindir sayısı, 4 kırmızı, 6 yeşil ve 8 mavi). Dağılım grafiğindeki noktaların üzerine gelmek satırın adını verir (bu durumda arabanın markası).


0

Yorum yapamayacağım için 2c'yi daroczig'in cevabına cevaplayıcı olarak vermem gerekiyor ...

Elips dağılım grafiği aslında elips paketindendir ve şunlarla oluşturulur:

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

(man sayfasından)

Corrplot paketi - önerildiği gibi - burada bulunan güzel resimlerle de faydalı olabilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.