2012-05-22 35 views
42
library(ggplot2) 
df <- data.frame(x=1:10, y=rnorm(10)) 
p1 <- ggplot(df, aes(x,y)) + geom_point() 
plist <- list(p1,p1,p1,p1,p1) 
# In my real example,a plot function will fit a ggplot to a list of datasets 
#and return a list of ggplots like the example above. 

Tôi muốn sắp xếp các ô bằng cách sử dụng grid.arrange() trong gridExtra.Làm cách nào để sắp xếp danh sách các ô có sử dụng grid.arrange?

Làm cách nào để thực hiện điều này nếu số lượng ô trong plist có thể thay đổi?

này hoạt động: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

nhưng tôi cần một giải pháp tổng quát hơn. suy nghĩ?

+0

trong '? Grid.arrange' – baptiste

Trả lời

64

Làm thế nào về điều này:

library(gridExtra) 
n <- length(plist) 
nCol <- floor(sqrt(n)) 
do.call("grid.arrange", c(plist, ncol=nCol)) 

enter image description here

+0

Điều này rất hay, ngoại trừ chức năng không thể xử lý các đối tượng NULL. –

+0

Josh. Anh yêu em. Đã dành 2 giờ cho đến bây giờ. Bạn có quan tâm để giải thích tại sao điều này không hoạt động: 'grid.arrange (plist [[1: length (plist)]], ncol = nCol))' Tôi nhận được một lỗi như thế này: 'Lỗi trong hl.plots [[1 : 12]]: không có chỉ số nào ở cấp 3' Cảm ơn! – Anto

+1

@Anto Có vẻ như có một số điều sai trái với mã đó, nhưng cái cho bạn lỗi hiển thị có thể do cùng một loại lỗi như được hiển thị ở đây: 'x <- list (1,2); x [[3: 1]] '. Rộng hơn, sử dụng một cái gì đó như 'plist [...]' chứ không phải là 'plist [[...]]' để làm cho việc subsetting của bạn. Và sau đó sử dụng 'do.call()', mà chúng ta phải sử dụng vì 'grid.arrange()' không được thiết lập để lấy một danh sách làm đối số đầu tiên của nó. Chúc mừng, và may mắn nhất! –

4

Bạn có thể sử dụng grid.arrange()arrangeGrob() với danh sách miễn là bạn chỉ định danh sách bằng cách sử dụng grobs = lập luận trong từng chức năng. Ví dụ. trong ví dụ bạn đưa ra:

library(ggplot2) 
library(gridExtra) 
df <- data.frame(x=1:10, y=rnorm(10)) 
p1 <- ggplot(df, aes(x,y)) + geom_point() 
plist <- list(p1,p1,p1,p1,p1) 

grid.arrange(grobs = plist, ncol = 2) ## display plot 
ggsave(file = OutFileName, arrangeGrob(grobs = plist, ncol = 2)) ## save plot 
5

Vì lợi ích của sự hoàn chỉnh (và như cũ, đã trả lời câu hỏi này has been revived, recently) Tôi muốn thêm một giải pháp sử dụng cowplot gói:

cowplot::plot_grid(plotlist = plist, ncol = 2) 

enter image description here

+0

bất kỳ ý tưởng nào về việc chuyển danh sách các ô sử dụng mã này trả về lỗi này: 'Lỗi trong ggplot_to_gtable (x): Đối số cần phải thuộc lớp" ggplot "hoặc" gtable "' –

+0

Các ô được tạo ra như thế nào? Sử dụng gói 'ggplot2' hoặc đồ họa cơ sở? – Uwe

+0

'ggplot2'. 'grid.arrange' gần như đã làm việc cho tôi - nhưng, hóa ra danh sách các ô của tôi không được phổ biến. Tôi đã đăng sự cố dưới dạng câu hỏi: http://stackoverflow.com/questions/43216262/saving-multiple-ggplots-created-in-a-for-loop-to-a-single-plot. Vì vậy, tôi tự hỏi liệu đó có phải là vấn đề đối với cowplot hay không –

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