Làm cách nào để sắp xếp một danh sách biến các mảnh đất bằng cách sử dụng grid.arrange?


92
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 lô bằng cách sử dụng grid.arrange()trong gridExtra.

Làm cách nào để làm điều này nếu số lượng ô trong đó plistthay đổi?

Những công việc này: 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ĩ?

Câu trả lời:


139

Còn cái này thì sao:

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

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


Điều này rất hay, ngoại trừ hàm không thể xử lý các đối tượng NULL.
Roman Luštrik

Josh. Tôi mến bạn. Đã dành 2 giờ cho việc này cho đến nay. 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 gặp lỗi như sau: Error in hl.plots[[1:12]] : no such index at level 3Cảm ơn!
Anto

2
@Anto Dường như có một vài điều sai với mã mà, nhưng một trong những đem lại cho bạn những 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]]. Nói một cách rộng rãi hơn, hãy sử dụng một cái gì đó giống như plist[...]thay vì plist[[...]]để thực hiện việc thiết lập con 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à chúc may mắn!
Josh O'Brien

31

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 =đối số trong mỗi hàm. 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

1
Đã khiến tôi khó khăn quá lâu để tìm thấy câu trả lời này ... cảm ơn! Đây là đơn giản nhất.
Matt L.

16

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

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

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


bất kỳ ý tưởng tại sao đi qua một danh sách các lô sử dụng mã này trả về lỗi này: Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
geog_newbie

Làm thế nào các lô được tạo ra? Sử dụng ggplot2gói hoặc đồ họa cơ sở?
Uwe

ggplot2. grid.arrangegần như làm việc cho tôi - nhưng, hóa ra danh sách các mảnh đất của tôi không được phổ biến. Tôi đã đăng vấn đề dưới dạng câu hỏi: stackoverflow.com/questions/43216262/… . Vì vậy, tôi đang tự hỏi liệu đó cũng có thể là vấn đề đối với cowplot
geog_newbie

10

Tôi biết câu hỏi nêu cụ thể bằng cách sử dụng gói gridExtra , nhưng wrap_plotshàm từ gói chắp vá là một cách tuyệt vời để xử lý danh sách có độ dài thay đổi:

library(ggplot2)
# devtools::install_github("thomasp85/patchwork")
library(patchwork)

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

wrap_plots(plist)

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

Một điều hữu ích về nó là bạn không cần chỉ định số lượng cột được yêu cầu và sẽ nhằm mục đích giữ cho số lượng cột và hàng bằng nhau. Ví dụ:

plist <- list(p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1)
wrap_plots(plist) # produces a 4 col x 4 row plot

Tìm hiểu thêm về gói chắp vá tại đây


Tôi dường như không thể cài đặt gói mà bạn đã đề cập ở đây
baxx

Bạn đã thử chạy dòng cài đặt được nhận xét ở trên devtools::install_github("thomasp85/patchwork")chưa?
Michael Harper

Cảm ơn bạn, tôi đã không. Tôi vừa thử sử dụng cài đặt từ RStudio.
baxx

1
Gói này chưa có sẵn trên CRAN, vì vậy bạn phải cài đặt nó qua GitHub. Hy vọng rằng điều này sẽ không còn xảy ra lâu nữa vì nó là một gói tuyệt vời!
Michael Harper

1

Để phù hợp với tất cả các ô trên một trang, bạn có thể tính số cột và hàng như sau:

x = length(plots)

cols = round(sqrt(x),0)
rows = ceiling(x/cols)

Vì hầu hết các hàm vẽ đồ thị có ncol và nrow làm đối số, bạn chỉ có thể đặt chúng vào đó. Tôi thích ggarrange từ ggpubr.

ggarrange(plotlist = plots, ncol=cols, nrow = rows)

Điều này ủng hộ nhiều hàng hơn cột vì vậy hãy đảo ngược nếu bạn muốn ngược lại. Tức là đối với 6 ô, nó sẽ cho 3 hàng và 2 cột chứ không phải ngược lại.

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.