2010-09-17 26 views
81

Có thể vẽ một ma trận các ô phân tán bằng ggplot2, sử dụng các tính năng đẹp của ggplot như ánh xạ các yếu tố bổ sung cho màu sắc, hình dạng, v.v ...Tạo một ma trận các điểm tán xạ (cặp() tương đương) trong ggplot2

Tôi đang suy nghĩ về điều gì đó tương tự như chức năng basepairs.

+15

Ngoài ra kiểm tra ggally – hadley

+1

Ah, tôi không thấy nhận xét của bạn có hadley. Tôi đã thực hiện câu trả lời của tôi CW để không ăn cắp niềm tin của bạn :) – naught101

Trả lời

22

Bạn có thể muốn thử plotmatrix:

library(ggplot2) 
    data(mtcars) 
    plotmatrix(mtcars[,1:3]) 

với tôi mpg (cột đầu tiên trong mtcars) không phải là một yếu tố. Tôi đã không kiểm tra nó, nhưng không có lý do tại sao nó phải là một. Tuy nhiên tôi nhận được một biểu đồ phân tán :)


Lưu ý: Để tham khảo trong tương lai, các chức năng plotmatrix() đã được thay thế bằng ggpairs() chức năng từ gói GGally như @ naught101 gợi ý in another response below cho câu hỏi này.

+0

Tôi không thể có được khía cạnh để làm việc về vấn đề này, có vẻ như nó đòi hỏi các yếu tố ở phía bên phải của công thức .. Hoặc bạn có thể cho tôi một ví dụ tối thiểu? –

+1

Bất cứ ai cũng biết cách thêm màu? Tôi dường như không thể nhận được https://gist.github.com/1405150 này để làm việc –

+0

Phần đầu tiên của câu trả lời này là sai và gây nhầm lẫn. Bạn không thể làm các cặp với faceting: bạn chỉ có thể làm y bởi x lô, và nhóm chúng theo các yếu tố. Nói cách khác, với faceting bạn có cùng x và y trên mỗi ô phụ; với các cặp, bạn có x khác nhau trên mỗi cột và một y khác nhau trên mỗi hàng. – naught101

171

Tôi tiếp tục muốn làm điều này, nhưng plotmatrix là crap. Hadley recommends sử dụng số GGally package để thay thế. Nó có một hàm, ggpairs đó là một lô được cải thiện rất nhiều (cho phép bạn sử dụng các biến không liên tục trong các khung dữ liệu của bạn). Nó lô lô khác nhau trong mỗi hình vuông, tùy thuộc vào loại biến:

library(GGally) 
ggpairs(iris, aes(colour = Species, alpha = 0.4)) 

enter image description here

+22

Điều này thực sự tuyệt vời. Cần lưu ý rằng bất kỳ biến 'colour' nào cũng là một yếu tố; đã dành 45 phút để tìm ra điều đó. – gregmacfarlane

+0

+1. Nhân tiện, bạn có biết cách điều chỉnh ô để các nhãn được hiển thị toàn bộ và không chồng chéo không? –

+1

Có cách nào để vẽ các ma trận tương quan mà không có cặp?Ví dụ tôi cần phải vẽ cột đầu tiên so với các cột khác.ggpairs cho cặp rất khả thi.Với ví dụ tôi có 10 cột và nó mang lại cho tôi 10 * 10 = 100.Nhưng tôi muốn 1 cột so với 9 chỉ khác – Rgeek

4

Nếu ai muốn có được một đối tượng ggplot (không ggmatrix như trong trường hợp của ggpairs()), giải pháp là để làm tan dữ liệu hai lần, sau đó ggplot với mặt nạ. facet_wrap sẽ tốt hơn facet_grid trong việc giới hạn vùng được vẽ, với tham số scales = 'free' được cung cấp.

require(ggplot2) 
require(dplyr) 
require(tidyr) 

gatherpairs <- function(data, ..., 
         xkey = '.xkey', xvalue = '.xvalue', 
         ykey = '.ykey', yvalue = '.yvalue', 
         na.rm = FALSE, convert = FALSE, factor_key = FALSE) { 
    vars <- quos(...) 
    xkey <- enquo(xkey) 
    xvalue <- enquo(xvalue) 
    ykey <- enquo(ykey) 
    yvalue <- enquo(yvalue) 

    data %>% { 
    cbind(gather(., key = !!xkey, value = !!xvalue, !!!vars, 
       na.rm = na.rm, convert = convert, factor_key = factor_key), 
      select(., !!!vars)) 
    } %>% gather(., key = !!ykey, value = !!yvalue, !!!vars, 
       na.rm = na.rm, convert = convert, factor_key = factor_key) 
} 

iris %>% 
    gatherpairs(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) %>% { 
    ggplot(., aes(x = .xvalue, y = .yvalue, color = Species)) + 
     geom_point() + 
     geom_smooth(method = 'lm') + 
     facet_wrap(.xkey ~ .ykey, ncol = length(unique(.$.ykey)), scales = 'free', labeller = label_both) + 
     scale_color_brewer(type = 'qual') 
} 

enter image description here

Các vấn đề liên quan