2012-06-13 24 views
7

Nếu tôi có một data.frame dat và muốn âm mưu của nhóm dữ liệu sử dụng facet_wrap:cố định "số" của âm mưu sử dụng facet_wrap

dat <- data.frame(x = runif(150), y = runif(150), z = letters[1:15]) 

ggplot(dat[dat$z %in% letters[1:9], ], aes(x, y)) + 
    geom_point() + 
    facet_wrap(~ z, ncol = 3, nrow = 3) 

này trông tuyệt vời và thực hiện như mong đợi. Tuy nhiên, nếu tôi vẽ lô tiếp theo của z trên lô đất mới:

ggplot(dat[dat$z %in% letters[10:15], ], aes(x, y)) + 
    geom_point() + 
    facet_wrap(~ z, ncol = 3, nrow = 3) 

Tôi không còn có 3 hàng và 3 cột nữa. Tôi có thể sửa các tỷ lệ khung hình của các ô bằng cách sử dụng opts(aspect.ratio = 1) nhưng tôi vẫn đặt chúng một cách khác biệt với cốt truyện trước đó của tôi. Tôi muốn nó xuất hiện như thể luôn luôn có 9 ô trên trang ngay cả khi có 6 hoặc 1. Có thể không?

Trả lời

9

Hãy thử điều này,

library(ggplot2) 
library(plyr) 
library(gridExtra) 

dat <- data.frame(x=runif(150), y=runif(150), z=letters[1:15]) 

plotone = function(d) ggplot(d, aes(x, y)) + 
    geom_point() + 
    ggtitle(unique(d$z)) 

p = plyr::dlply(dat, "z", plotone) 
g = gridExtra::marrangeGrob(grobs = p, nrow=3, ncol=3) 
ggsave("multipage.pdf", g) 
+0

Cảm ơn, điều đó sẽ thực hiện. Tôi đã hy vọng làm điều này chỉ trong 'ggplot' mà không có' gridExtra'. Tôi sẽ chấp nhận câu trả lời của bạn một chút nếu không có ai đi theo một cách. – Justin

1

library(cowplot) cung cấp một chức năng tiện dụng plot_grid rằng chúng ta có thể sử dụng để sắp xếp một danh sách các lô.

Thứ nhất, cho phép xây dựng danh sách các lô cá nhân:

p = lapply(unique(dat$z), function(i){ 
     ggplot(dat[dat$z == i, ], aes(x, y)) + 
     geom_point() + 
     facet_wrap(~z) 
     }) 

Bây giờ chúng ta có thể sắp xếp các tấm pin sử dụng plot_grid:

plot_grid(plotlist = p[1:9], nrow = 3, ncol = 3) 

enter image description here

plot_grid(plotlist = p[10:15], nrow = 3, ncol = 3) 

enter image description here

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