Vẽ ma trận tương quan thành đồ thị


93

Tôi có một ma trận với một số giá trị tương quan. Bây giờ tôi muốn vẽ biểu đồ đó trong một biểu đồ trông giống như sau:

nhập mô tả hình ảnh ở đây

Làm thế nào tôi có thể đạt được điều đó?


Bạn có thể thấy chức năng này thú vị: gist.github.com/low-decarie/5886616 mặc dù nó vẫn cần được cải thiện ( stackoverflow.com/questions/17370853/… )
Etienne Low-Décarie

@anon bạn có thể chia sẻ mã cho cái này không? đây chính xác là những gì tôi đang tìm kiếm cho trình bày của tôi
Pavlos Panteliadis

Câu trả lời:


57

Nhanh chóng, bẩn thỉu và trong sân bóng:

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

nhập mô tả hình ảnh ở đây


2
Nó trông rất giống với ví dụ từ OP (phông chữ, màu sắc, bố cục). Có vẻ như bản gốc cũng được tạo bằng lưới. Câu trả lời chi tiết tuyệt vời, +1.
Marek

1
Cảm ơn bạn đã trả lời. Nhiều người được sử dụng để biểu đồ tương quan trong đó đường chéo chứa 1-s chạy từ trên cùng bên trái đến hình vuông dưới cùng bên phải (xem hình ví dụ trong câu hỏi), thay vì từ dưới cùng bên trái sang hình vuông trên cùng bên phải, như trong giải pháp. Đây là cách khắc phục sự cố này: cor_reversed <- apply (cor, 2, rev); levelplot (t (cor_reversed), ...)
bỏ qua

@ bill_080 tại sao sao chép-dán mã của bạn lại không in được ma trận tương quan?
Pavlos Panteliadis

59

Thay vì trông giống như "ít" hơn, nhưng đáng để kiểm tra (vì cung cấp thêm thông tin trực quan):

Hình elip ma trận tương quan : Hình elip ma trận tương quan Vòng tròn ma trận tương quan : Vòng tròn ma trận tương quan

Vui lòng tìm thêm ví dụ trong họa tiết corrplot do @assylias tham khảo bên dưới.


1
Trang web dường như không còn tồn tại. Bạn có bất kỳ mã hoặc mô tả gói nào cho âm mưu đầu tiên không?
ngôi sao sáng

1
@TrevorAlexander: Theo như tôi nhớ, cốt truyện đầu tiên được tạo ra bởi ellipse:plotcorr.
daroczig

Tôi đã gửi bản chỉnh sửa cho liên kết 1 tới: Cải thiện-visualisation.org/vis/id=250 cung cấp hình ảnh tương tự.
russellpierce

1
Cảm ơn bạn @rpierce, mặc dù tôi chỉ thấy hình ảnh ở đó mà không có nguồn R. Tôi nhớ gì ở đây?
daroczig


43

Rất dễ dàng với lattice :: levelplot:

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

nhập mô tả hình ảnh ở đây


30

Thư viện ggplot2 có thể xử lý điều này với geom_tile(). Có vẻ như có thể đã có một số thay đổi tỷ lệ được thực hiện trong biểu đồ ở trên vì không có bất kỳ mối tương quan tiêu cực nào, vì vậy hãy cân nhắc điều đó với dữ liệu của bạn. Sử dụng mtcarstập dữ liệu:

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

nhập mô tả hình ảnh ở đây

CHỈNH SỬA :

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

nhập mô tả hình ảnh ở đây

cho phép chỉ định màu của điểm giữa và nó mặc định là màu trắng, vì vậy có thể là một điều chỉnh tốt ở đây. Các tùy chọn khác có thể được tìm thấy trên trang web ggplot tại đâytại đây .


tốt (+1)! Mặc dù tôi sẽ thêm thang điểm ngắt thủ công (ví dụ c(-1, -0.6, -0.3, 0, 0.3, 0.6, 1):) với "white"ở giữa để màu sắc phản ánh sự đối xứng của mối tương quan một cách hiệu quả.
daroczig

@Daroczig - Điểm tốt. Có vẻ như tự động scale_fill_gradient2()đạt được chức năng mà bạn mô tả. Tôi không biết điều đó tồn tại.
Đuổi theo

1
thêm vào này: p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)sẽ làm cho nó tương tác
schlusie

Để làm cho đường chéo 1 đi từ trên cùng bên trái sang dưới cùng bên phải, cần phải đảo ngược các mức yếu tố để X1sử dụng:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
arun

11

Sử dụng gói 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")
}

Ví dụ:

nhập mô tả hình ảnh ở đây

IMO thay vì thanh lịch


9

Loại biểu đồ đó được gọi là "bản đồ nhiệt" trong số các thuật ngữ khác. Khi bạn đã có ma trận tương quan của mình, hãy vẽ biểu đồ bằng một trong các hướng dẫn khác nhau trên mạng.

Sử dụng đồ họa cơ sở: http://flowingdata.com/2010/01/21/how-to-make-a-heatmap-a-quick-and-easy-solution/

Sử dụng ggplot2: http://learnr.wordpress.com/2010/01/26/ggplot2-quick-heatmap-plotting/


Tôi không chắc việc gọi nó là 'bản đồ nhiệt' có phải là một phát minh khá hiện đại hay không. Có vẻ hợp lý nếu bạn đang cố gắng hiển thị 'điểm nóng' bằng cách sử dụng bảng màu đỏ-cam-vàng, nhưng nhìn chung nó chỉ là một âm mưu hình ảnh, hoặc một âm mưu ma trận hoặc một âm mưu raster. Tôi sẽ quan tâm đến việc tìm tài liệu tham khảo lâu đời nhất gọi nó là 'bản đồ nhiệt'. tldr; "[cần dẫn nguồn]"
Spacedman

Tôi nghĩ bạn nói đúng rằng bản đồ nhiệt không nhất thiết phải là cái tên sớm nhất cho nó. Wikipedia liệt kê một bài báo năm 1957, nhưng tôi đã kiểm tra tờ giấy đó và thuật ngữ "bản đồ nhiệt" không xuất hiện trong đó (cũng như đồ họa không giống hệt như mẫu hiện tại).
Ari B. Friedman,

5

Tôi đang làm việc trên một cái gì đó tương tự như hình ảnh được đăng bởi @daroczig, với mã được đăng bởi @Ulrik bằng cách sử dụng plotcorr()chức năng của ellipsegói. Tôi thích việc sử dụng các hình elip để thể hiện các mối tương quan và việc sử dụng các màu sắc để thể hiện mối tương quan âm và dương. Tuy nhiên, tôi muốn màu sắc bắt mắt nổi bật với các tương quan gần 1 và -1, không phải cho những màu gần 0.

Tôi đã tạo một giải pháp thay thế trong đó các hình elip màu trắng được phủ trên các vòng tròn màu. Mỗi hình elip màu trắng có kích thước sao cho tỷ lệ của vòng tròn màu có thể nhìn thấy phía sau nó bằng tương quan bình phương. Khi mối tương quan gần 1 và -1, hình elip màu trắng nhỏ và phần lớn vòng tròn màu có thể nhìn thấy được. Khi mối tương quan gần 0, hình elip màu trắng lớn và có thể nhìn thấy một ít hình tròn màu.

Chức năng, plotcor()có sẵn tại https://github.com/JVAdams/jvamisc/blob/master/R/plotcor.r .

mtcarsDưới đây là một ví dụ về biểu đồ kết quả sử dụng tập dữ liệu.

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

kết quả của lệnh gọi hàm plotcor ()


3

Tôi nhận ra rằng nó được một thời gian, nhưng độc giả mới có thể được quan tâm rplot()từ các corrrgói ( https://cran.rstudio.com/web/packages/corrr/index.html ), có thể sản xuất ra các loại âm mưu @daroczig đề cập đến , nhưng thiết kế cho cách tiếp cận đường ống dữ liệu:

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

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây


2

Hàm corrplot () từ gói corrplot R cũng có thể được sử dụng để vẽ biểu đồ tương quan.

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

một số bài báo mô tả cách tính toán và hình dung ma trận tương quan được xuất bản tại đây:


1

Một giải pháp khác mà tôi đã tìm hiểu gần đây là một bản đồ nhiệt tương tác được tạo bằng gói qtlcharts .

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

Dưới đây là hình ảnh tĩnh của âm mưu kết quả. nhập mô tả hình ảnh ở đây

Bạn có thể xem phiên bản tương tác trên blog của tôi . Di chuột qua bản đồ nhiệt để xem các giá trị hàng, cột và ô. Nhấp vào một ô để xem biểu đồ phân tán với các ký hiệu được tô màu theo nhóm (trong ví dụ này, số lượng hình trụ, 4 màu đỏ, 6 màu xanh lá cây và 8 màu xanh lam). Di chuột qua các điểm trong biểu đồ phân tán sẽ đưa ra tên của hàng (trong trường hợp này là cấu tạo của ô tô).


0

Vì tôi không thể bình luận, tôi phải đưa 2c của tôi cho câu trả lời bởi daroczig với tư cách là một nhà cảm xạ ...

Biểu đồ phân tán ellipse thực sự là từ gói ellipse và được tạo bằng:

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

(từ trang người đàn ông)

Gói corrplot cũng có thể - theo đề xuất - hữu ích với các hình ảnh đẹp được tìm thấy ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.