Làm cách nào để có được một lưới ggplots 'không cân bằng'?


94

Với grid.arrangetôi có thể sắp xếp nhiều ggplothình trong một lưới để đạt được một hình nhiều bảng bằng cách sử dụng một cái gì đó như:

library(ggplot2)
library(grid)
library(gridExtra)

tạo một số lô ggplot2, sau đó

plot5 <- grid.arrange(plot4, plot1, heights=c(3/4, 1/4), ncol=1, nrow=2)

Làm cách nào để có được bố cục 2 ô 'không cân bằng' với một ô trong toàn bộ ô đầu tiên và ba ô trong ô thứ hai? Tôi đã đùa giỡn với cách tiếp cận 'lưới ô vuông' bằng cách cố gắng sử dụng grid.arrangeđể vẽ một ô lưới (ví dụ: plot5ở trên) với một ô khác, nhưng đã thu được:

Lỗi trong layoutGrob (..., as.table = as.table, clip = clip, main = main,: input phải là grobs!

Cập nhật:

Cảm ơn vì lời khuyên. Tôi sẽ xem xét viewportsgrid. Trong khi đó, nhờ có @DWin, layOuthàm trong gói 'wq' hoạt động rất tốt cho hình biên dịch trong Sweavetài liệu của tôi : nhập mô tả hình ảnh ở đây

Cập nhật 2:

Các arrangeGroblệnh (theo đề nghị của @baptiste) cũng hoạt động tốt, và có vẻ rất trực quan - ít nhất đó là dễ dàng để độ rộng của alter làm hai cột. Nó cũng có lợi ích là không yêu cầu gói `wq '.

ví dụ Đây là mã từ tệp Sweave của tôi:

<<label=fig5plot, echo=F, results=hide>>=
plot5<-grid.arrange(plot4, arrangeGrob(plot1, plot2, plot3, ncol=1), 
                    ncol=2, widths=c(1,1.2))
@
\begin{figure}[]
    \begin{center}
<<label=fig5,fig=TRUE,echo=T, width=10,height=12>>=
<<fig5plot>>
@
\end{center}
\caption{Combined plots using the `arrangeGrob' command.}
\label{fig:five}
\end{figure}

tạo ra kết quả sau: nhập mô tả hình ảnh ở đây

BTW, Có ai cho tôi biết tại sao '> NA' xuất hiện không?


Bạn có thể phải tự thiết lập các chế độ xem - grid.arrangecó thể không đủ linh hoạt (tìm kiếm stackoverflow cho "[r] lưới chế độ xem")
Ben Bolker

2
@BenBolker Đã chỉ cho bạn một hướng đi hiệu quả bằng cách sử dụng grid. Xem thêm cuốn sách ggplot2 của Hadley, Phần 8.4.2.
Ari B. Friedman,

1
@BenBolker grid.arrangecó thể được sử dụng với các khung nhìn lồng nhau bằng cách sử dụng đồng hành của nó arrangeGrob(về cơ bản trả về a gTree), như trong ví dụ tôi đưa ra bên dưới.
baptiste

1
nhiệm vụ cuối cùng của bạn plot5là không bắt buộc vì grid.arrangekhông trả về (NULL). Nếu bạn muốn lưu lại kết quả sử dụng háng arrangeGrob(và grid.drawđể hiển thị nó).
baptiste

Câu trả lời:


73

grid.arrangevẽ trực tiếp trên thiết bị; nếu bạn muốn kết hợp nó với các đối tượng lưới khác mà bạn cần arrangeGrob, như trong

 p = rectGrob()
 grid.arrange(p, arrangeGrob(p,p,p, heights=c(3/4, 1/4, 1/4), ncol=1),
              ncol=2)

Chỉnh sửa (07/2015): với v> 2.0.0, bạn có thể sử dụng layout_matrixđối số,

 grid.arrange(p,p,p,p, layout_matrix = cbind(c(1,1,1), c(2,3,4)))

6
Bạn có thể giải thích cách cbind(c(1,1,1), c(2,3,4))ma trận mô tả sự sắp xếp của các hình?
Ron Gejman

5
@RonGejman thật dễ dàng nếu bạn in ma trận 3x2 trên màn hình: cột đầu tiên là tất cả 1s, đó là vị trí của biểu đồ đầu tiên, kéo dài ba hàng; cột thứ hai chứa các ô 2, 3, 4, mỗi ô chiếm một hàng.
baptiste

17

Tôi đã thử tìm ra nó với lưới và nghĩ rằng tôi đã gặp sự cố nhưng cuối cùng lại thất bại (mặc dù bây giờ nhìn vào mã trong hàm mà tôi trích dẫn bên dưới, tôi có thể thấy rằng tôi đã thực sự gần ... :-)

Gói 'wq' có một layOutchức năng sẽ làm điều đó cho bạn:

p1 <- qplot(mpg, wt, data=mtcars)
layOut(list(p1, 1:3, 1),   # takes three rows and the first column
        list(p1, 1, 2),    # next three are on separate rows
         list(p1, 2,2), 
          list(p1, 3,2))

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


Wow, đó là một chức năng hữu ích! Tôi nghĩ sao chép + dán có thể đã làm bạn thất bại; bạn đã có nghĩa là cho g1, g2, vv để tất cả được p1?
joran

3
@joran: Tôi đã làm. Tôi không thể nhớ cái nào trong "ba đức tính của lập trình" là Lười biếng, nhưng tôi biết điều đó có ở đâu đó.
IRTFM

Cảm ơn! Làm việc rất tốt. Xem ở trên.
user441706

2

Một giải pháp thay thế khác là patchworkgói của Thomas Lin Pedersen.

# install.packages("devtools")
# devtools::install_github("thomasp85/patchwork")
library(patchwork)

Tạo một số âm mưu.

p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + facet_grid(rows = vars(gear))
p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
p3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec))
p4 <- ggplot(mtcars) + geom_bar(aes(carb))

Bây giờ hãy sắp xếp các ô.

p1 + (p2 / p3 / p4)

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


1

Ngoài ra còn có gói đa nhân hình đáng đề cập. Xem thêm câu trả lời này .

library(ggplot2)
theme_set(theme_bw())

q1 <- ggplot(mtcars) + geom_point(aes(mpg, disp))
q2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
q3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec))
q4 <- ggplot(mtcars) + geom_bar(aes(carb))

library(magrittr)
library(multipanelfigure)

figure1 <- multi_panel_figure(columns = 2, rows = 3, panel_label_type = "upper-roman")

figure1 %<>%
  fill_panel(q1, column = 1, row = 1:3) %<>%
  fill_panel(q2, column = 2, row = 1) %<>%
  fill_panel(q3, column = 2, row = 2) %<>%
  fill_panel(q4, column = 2, row = 3)
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
figure1

Được tạo vào ngày 2018-07-16 bởi gói reprex (v0.2.0.9000).

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.