Plot matriks korelasi menjadi grafik


93

Saya memiliki matriks dengan beberapa nilai korelasi. Sekarang saya ingin memplotnya dalam grafik yang terlihat kurang lebih seperti itu:

masukkan deskripsi gambar di sini

Bagaimana saya bisa mencapai itu?


Anda mungkin menganggap fungsi ini menarik: gist.github.com/low-decarie/5886616 meskipun masih perlu ditingkatkan ( stackoverflow.com/questions/17370853/… )
Etienne Low-Décarie

@anon dapatkah Anda membagikan kode untuk ini? inilah yang saya cari untuk presentasi saya
Pavlos Panteliadis

Jawaban:


57

Cepat, kotor, dan kasar:

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

masukkan deskripsi gambar di sini


2
Ini terlihat sangat mirip dengan contoh dari OP (font, warna, tata letak). Sepertinya aslinya dibuat dengan kisi juga. Jawaban mendetail yang bagus, +1.
Marek

1
Terima kasih atas jawabannya. Banyak orang terbiasa dengan plot korelasi di mana diagonal yang berisi 1-s membentang dari kiri atas ke kotak kanan bawah (lihat gambar contoh di pertanyaan), daripada dari kiri bawah ke kotak kanan atas, seperti di larutan. Berikut adalah cara untuk memperbaiki masalah ini: cor_reversed <- apply (cor, 2, rev); levelplot (t (cor_reversed), ...)
lewati

@ bill_080 mengapa copy-paste kode Anda tidak akan mencetak matriks korelasi?
Pavlos Panteliadis

59

Agak seperti "kurang", tetapi perlu diperiksa (karena memberikan lebih banyak informasi visual):

Elips matriks korelasi : Elips matriks korelasi lingkaran korelasi matriks : Lingkaran matriks korelasi

Silakan temukan lebih banyak contoh dalam sketsa corplot yang direferensikan oleh @assylias di bawah ini.


1
Situs tersebut tampaknya sudah tidak berfungsi. Apakah Anda memiliki kode atau deskripsi paket untuk plot pertama?
terang

1
@TrevorAlexander: Sejauh yang saya ingat, plot pertama dibuat oleh ellipse:plotcorr.
daroczig

Saya telah mengirimkan edit untuk link 1 ke: improvement-visualisation.org/vis/id=250 yang memberikan gambar yang sama.
russellpierce

1
Terima kasih @rpierce, meskipun saya hanya melihat gambar di sana tanpa sumber R. Apa yang saya lewatkan di sini?
daroczig


43

Sangat mudah dengan kisi :: levelplot:

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

masukkan deskripsi gambar di sini


30

Library ggplot2 dapat menangani ini dengan geom_tile(). Sepertinya telah dilakukan penskalaan ulang pada plot di atas karena tidak ada korelasi negatif, jadi pertimbangkan hal itu dengan data Anda. Menggunakan mtcarsdataset:

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

masukkan deskripsi gambar di sini

EDIT :

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

masukkan deskripsi gambar di sini

memungkinkan untuk menentukan warna titik tengah dan defaultnya putih jadi mungkin penyesuaian yang bagus di sini. Opsi lain dapat ditemukan di situs ggplot di sini dan di sini .


bagus (+1)! Meskipun saya akan menambahkan skala pemutusan manual (misalnya :) c(-1, -0.6, -0.3, 0, 0.3, 0.6, 1)dengan "white"di tengah untuk membiarkan warna mencerminkan simetri korelasi yang efisien.
daroczig

@Daroczig - Poin bagus. Sepertinya scale_fill_gradient2()mencapai fungsionalitas yang Anda gambarkan secara otomatis. Saya tidak tahu itu ada.
Mengejar

1
menambahkan ini: p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)akan membuatnya interaktif
schlusie

Untuk membuat diagonal 1 bergerak dari kiri atas ke kanan bawah, diperlukan pembalikan level faktor untuk X1menggunakan:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
arun

11

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

Sebagai contoh:

masukkan deskripsi gambar di sini

IMO agak elegan


9

Jenis grafik itu disebut "peta panas" di antara istilah-istilah lainnya. Setelah Anda mendapatkan matriks korelasi, buat plot menggunakan salah satu dari berbagai tutorial di luar sana.

Menggunakan grafik dasar: http://flowingdata.com/2010/01/21/how-to-make-a-heatmap-a-quick-and-easy-solution/

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


Saya tidak yakin apakah menyebutnya 'peta panas' adalah penemuan yang cukup modern. Tampaknya masuk akal jika Anda mencoba menampilkan 'hotspot' dengan menggunakan skema warna merah-oranye-kuning, tetapi secara umum ini hanya plot gambar, atau plot matriks, atau plot raster. Saya akan tertarik untuk menemukan referensi terlama yang menyebutnya 'peta panas'. tldr; "[butuh rujukan]"
Spacedman

Saya pikir Anda benar bahwa peta panas belum tentu merupakan nama paling awal untuk itu. Wikipedia mencantumkan makalah tahun 1957, tetapi saya memeriksa kertas itu dan istilah "peta panas" tidak muncul di mana pun di dalamnya (juga tidak grafiknya terlihat persis seperti bentuk saat ini).
Ari B. Friedman

5

Saya telah mengerjakan sesuatu yang mirip dengan visualisasi yang diposting oleh @daroczig, dengan kode yang diposting oleh @Ulrik menggunakan plotcorr()fungsi ellipsepaket. Saya suka penggunaan elips untuk mewakili korelasi, dan penggunaan warna untuk mewakili korelasi negatif dan positif. Namun demikian, saya ingin warna yang menarik terlihat menonjol untuk korelasi yang mendekati 1 dan -1, bukan untuk yang mendekati 0.

Saya membuat alternatif di mana elips putih dilapisi pada lingkaran berwarna. Setiap elips putih berukuran sehingga proporsi lingkaran berwarna yang terlihat di belakangnya sama dengan korelasi kuadrat. Ketika korelasinya mendekati 1 dan -1, elips putih kecil, dan banyak lingkaran berwarna yang terlihat. Ketika korelasi mendekati 0, elips putih besar, dan sedikit lingkaran berwarna terlihat.

Fungsinya,, plotcor()tersedia di https://github.com/JVAdams/jvamisc/blob/master/R/plotcor.r .

Contoh plot yang dihasilkan menggunakan mtcarsdataset ditunjukkan di bawah ini.

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

hasil panggilan ke fungsi plotcor ()


3

Saya menyadari bahwa ini sudah lama, tetapi pembaca baru mungkin tertarik rplot()dari corrrpaket ( https://cran.rstudio.com/web/packages/corrr/index.html ), yang dapat menghasilkan jenis plot @daroczig menyebutkan , tetapi desain untuk pendekatan pipeline data:

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

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini



1

Solusi lain yang baru-baru ini saya pelajari adalah peta panas interaktif yang dibuat dengan paket qtlcharts .

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

Di bawah ini adalah gambar statis dari plot yang dihasilkan. masukkan deskripsi gambar di sini

Anda dapat melihat versi interaktif di blog saya . Arahkan kursor ke peta panas untuk melihat nilai baris, kolom, dan sel. Klik pada sel untuk melihat diagram sebar dengan simbol yang diwarnai menurut kelompok (dalam contoh ini, jumlah silinder, 4 berwarna merah, 6 berwarna hijau, dan 8 berwarna biru). Mengarahkan kursor ke titik-titik di sebar memberikan nama baris (dalam hal ini merek mobil).


0

Karena saya tidak bisa berkomentar, saya harus memberikan 2c saya untuk jawaban daroczig sebagai jawaban ...

Plot sebaran elips memang dari paket elips dan dibuat dengan:

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

(dari halaman manual)

Paket corrplot mungkin juga - seperti yang disarankan - berguna dengan gambar-gambar cantik yang ditemukan di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.