Tạo ma trận biểu đồ phân tán (cặp () tương đương) trong ggplot2


117

Có thể vẽ một ma trận gồm các biểu đồ phân tán ggplot2, bằng cách sử dụng ggplotcác tính năng tốt đẹp như ánh xạ các yếu tố bổ sung với màu sắc, hình dạng, v.v. và thêm mượt mà?

Tôi đang nghĩ về một cái gì đó tương tự như basechức năng pairs.


17
Ngoài ra kiểm tra ggally
hadley

1
À, tôi không thấy bình luận của bạn ở đó hadley. Tôi đã trả lời của tôi CW để không ăn cắp của bạn CRED :)
naught101

Câu trả lời:


37

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

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

đối với tôi mpg (cột đầu tiên trong mtcars) không nên 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 âm mưu phân tán :)


Lưu ý: Để tham khảo trong tương lai, plotmatrix()hàm đã được thay thế bằng ggpairs()hàm từ GGallygói như @ naught101 gợi ý trong một câu trả lời khác bên dưới cho câu hỏi này.


Tôi không thể giải quyết vấn đề này, có vẻ như nó yêu cầu 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?
Karsten W.

1
Bất cứ ai biết làm thế nào để thêm màu sắc? Tôi dường như không thể có được điều này gist.github.com/1405150 làm việc
Etienne Low-Décarie

1
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ể thực hiện các cặp lô với lô xiên: bạn chỉ có thể thực hiện các lô y theo x và nhóm chúng theo các yếu tố. Nói cách khác, với các mặt, bạn có cùng x và y trên mỗi ô phụ; với các cặp, bạn có một x khác nhau trên mỗi cột và một y khác trên mỗi hàng.
naught101

28
Để tham khảo trong tương lai, plotmatrix()hàm đã được thay thế bằng ggpairs()hàm từ GGallygói như @ naught101 gợi ý trong một câu trả lời khác cho câu hỏi này.
smillig

1
@MattBannert đã thêm nhận xét vào bài đăng của bạn để hiển thị rõ hơn, tôi có thể hiểu những người phản đối nếu đã bỏ qua việc đọc các nhận xét. Mong bạn không phiền.
zx8754

232

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

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

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


26
Điều này thực sự tuyệt vời. Điều đáng chú ý là bất kỳ colourbiến nào cũng phải là một nhân tố; đã dành 45 phút để tìm ra điều đó.
gregmacfarlane.

1
Có cách nào để vẽ các ma trận tương quan này mà không có các cặp không? Ví dụ: tôi cần vẽ cột đầu tiên so với mọi cột khác. Các cặpggpairs rất có thể xảy ra. Ví dụ: tôi có 10 cột và nó cho tôi 10 * 10 = 100. chỉ muốn cột đầu tiên so với cột 9 khác
Rgeek

1
@Rgeek: bạn có thể tạo meltkhung dữ liệu bằng cách sử dụng biến mà bạn quan tâm làm biến id, sau đó dựa vào các biến khác.
naught101

6
Không sử dụng ggpairs, chỉ sử dụng ggplot2 bình thường, như ggplot(data, aes(x=id, y=value)) + geom_point() + facet_grid(.~variable). Tôi giả sử bạn đang nói về biểu đồ phân tán khi bạn nói "biểu đồ tương quan", bởi vì tôi chưa bao giờ nghe nói về điều đó.
naught101

3
@JimGreen GGally::ggpairs(iris, aes(colour = Species, alpha=0.4))
ElBaulP

17

Nếu một người muốn có được một ggplotđối tượng (không phải ggmatrixnhư trong trường hợp của ggpairs()), giải pháp là làm tan chảy dữ liệu hai lần, sau đó ggplotvới khía cạnh. facet_wrapsẽ tốt hơn là facet_gridgiới hạn diện tích được vẽ, với scales = 'free'tham số đượ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')
}

nhập mô tả hình ảnh ở đâ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.