2011-12-04 30 views
6

Tôi đang sử dụng R để tạo bản đồ nhiệt từ ma trận bằng cách sử dụng heatmap.2 - và tôi muốn nhóm những hình ảnh này thành một hình ảnh lớn - Những gì tôi thường sử dụng để đạt được điều này là bố cục() - nhưng điều này không hoạt động, vì heatmap.2 sử dụng bố cục và bố cục rõ ràng không hoạt động đệ quy.bố trí bên trong bố trí trong R

Có ai có bất kỳ đề xuất nào về cách nhóm 2 hình ảnh lại với nhau mà không có bố cục hoặc cách bố trí hỗ trợ các cuộc gọi đệ quy không?

mat = matrix(nrow=3,nrow=3,1:9) 
layout(matrix(nrow=2,ncol=1)) 
heatmap.2(mat) ## overrides the layout and produces only one plot that takes whole screen 
heatmap.2(mat) ## still only one image 

cảm ơn.

Trả lời

6

Điều gì sau đây là một hack gần như chắc chắn không phải là giải pháp hoàn hảo, nhưng nó có thể giúp bạn bắt đầu.

Tạo phiên bản của riêng bạn của hàm heatmap.2 được gọi là hm3. Trong mã cho hm3, nhận xét ra tất cả các ranh giới giữa:

if (missing(lhei) || is.null(lhei)) 

layout gọi:

layout(lmat, widths = lwid, heights = lhei, respect = FALSE) 

đó là một đoạn lớn của mã, có lẽ 30 dòng. Bây giờ đoạn mã sau tạo ra hai bản đồ nhiệt với dendrograms và các phím cạnh nhau:

x <- as.matrix(mtcars) 
lhei <- c(1.5, 4,1.5,4) 
lwid <- c(1.5, 4,1.5,4) 
layout(rbind(c(4,3,8,7),c(2,1,6,5)), 
    widths = lwid, heights = lhei, respect = FALSE) 
hm3(x) 
hm3(x) 

enter image description here

Rõ ràng, điều này sẽ đòi hỏi tinh chỉnh đáng kể để làm cho nó trông đẹp (và một khu vực âm mưu lớn hơn, tôi đã squished tất cả mọi thứ là một kích thước hợp lý để đăng ở đây).

Điều này hoàn toàn chưa được kiểm tra. Có khả năng là việc sử dụng bất kỳ tùy chọn nào trong hàm hm3 kiểm soát sự xuất hiện của ô sẽ khiến mọi thứ trở nên hơi khan hiếm. Nhưng đây có thể là điểm khởi đầu tốt cho thử nghiệm của riêng bạn để giải quyết những vấn đề đó.

+0

Cảm ơn - Quá xấu không có cách nào dễ dàng hơn để làm điều này ... Tôi sẽ để câu hỏi mở thêm một chút trong trường hợp ai đó biết giải pháp chung hơn, nhưng dường như cuộc sống khó khăn và giải pháp của bạn là tốt nhất, (mặc dù tôi có lẽ sẽ chỉ giải quyết vấn đề của tôi thay vì chơi với các mã bản đồ nhiệt mà không âm thanh vui vẻ). – dan12345

1

Bạn định làm gì với kết quả?

Nếu bạn chỉ muốn so sánh 2 bản đồ nhiệt cạnh nhau trên màn hình, thay vì kết hợp chúng thành một ô duy nhất, bạn có thể mở 2 thiết bị vẽ và sắp xếp chúng cạnh nhau để so sánh (đơn giản hơn nhiều so với việc tạo một biểu đồ) :

heatmap.2(mat1) 
dev.new() 
heatmap.2(mat2) 

Bây giờ hãy kéo một sang bên kia bằng chuột.

Nếu bạn muốn đưa đồ họa kết hợp vào một ấn phẩm thì có thể dễ dàng tạo 2 ô và chỉ đặt chúng cạnh nhau trong bất kỳ chương trình nào bạn đang sử dụng để tạo bài viết. Nếu bạn cần chúng trong một tệp, bạn vẫn có thể lưu 2 bản đồ nhiệt (hoặc các ô khác) thành 2 tệp rồi sử dụng các công cụ như imagemagick, gimp hoặc inkscape để kết hợp 2 tệp thành 1 với biểu đồ cạnh nhau.