2013-05-03 33 views
17

Tôi đang cố sắp xếp nhiều lô bằng cách sử dụng grid.arrange. Nó hiện công việc của cuốn sách, và khi gọi:Duy trì tỷ lệ biểu đồ sử dụng lưới.arrange

p1 <- ggplot(subset(mtcars, cyl = 4), aes(wt, mpg, colour = cyl)) + geom_point() 
p2 <- ggplot(subset(mtcars, cyl = 8), aes(wt, mpg, colour = cyl)) + geom_point() 

grid.arrange(p1, p2, ncol = 2) 

tôi nhận được hai lô đẹp, đối xứng có kích thước:

enter image description here

đồ thị của tôi tham khảo các thông số khác nhau nhưng họ chia sẻ cùng mã hóa màu cho các nhóm. Vì vậy, tôi muốn loại bỏ các huyền thoại từ tất cả nhưng một và tìm thấy một nơi tốt đẹp cho nó.

Tuy nhiên khi tôi cố gắng:

p3 <- ggplot(subset(mtcars, cyl = 8), aes(wt, mpg, colour = cyl)) + geom_point() + guides(colour=FALSE) 

grid.arrange(p3, p2, ncol = 2) 

Cốt truyện mà không có huyền thoại được (chính xác) lớn hơn:

enter image description here

Tôi muốn giữ cho kích thước (như độ dài của x trục) để giữ nguyên trên các đồ thị.

Tôi biết tôi có thể sử dụng faceting ở đây, nhưng tôi cũng sẽ cần phải kết hợp đồ thị khác nhau mà (tôi nghĩ) sẽ khó có thể thực hiện bằng khía cạnh ..

Có thể làm điều đó với grid.arrange ? Bất kỳ giải pháp nào khác có thể trợ giúp ở đây?

+0

bạn có thể thực hiện điều này mà không cần 'grid.arrange' bởi đánh bóng mặt. Nhưng không có cột 'class' trong' mtcars' để tôi thể hiện điều đó. – Arun

+0

@Hoạt động SOrry - lỗi của tôi. Ví dụ đã chuyển đổi thành hình trụ. Như tôi đã đề cập, tôi nhận thức được sự kỳ diệu của faceting, tuy nhiên tôi muốn tránh xa mà không cần sử dụng nó. – radek

Trả lời

11

Không gần như thanh lịch đơn giản như giải pháp @Josh 's, nhưng bạn có thể làm điều này với grid.arrange cho phép bạn duy trì hoặc xác định tỉ lệ khung hình của các ô, nhưng bạn cần tạo một số tableGrob cho chú giải của mình. Tôi trả lời một câu hỏi simillar here được nơi tôi đã nhận mã tiện dụng để thực hiện một tableGrob từ một huyền thoại ggplot2:

## Make a tableGrob of your legend 
tmp <- ggplot_gtable(ggplot_build(p2)) 
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
legend <- tmp$grobs[[leg]] 

# Plot objects using widths and height and respect to fix aspect ratios 
# We make a grid layout with 3 columns, one each for the plots and one for the legend 
grid.newpage() 
pushViewport(viewport(layout = grid.layout(1 , 3 , widths = unit(c(0.4 , 0.4 , 0.2) , "npc") ,heights = unit(c(0.45 , 0.45 , 0.45) , "npc") , respect = matrix(rep(1,3),1)))) 
print(p1 + theme(legend.position="none") , vp = viewport(layout.pos.row = 1 , layout.pos.col = 1)) 
print(p2 + theme(legend.position="none") , vp = viewport(layout.pos.row = 1, layout.pos.col = 2)) 
upViewport(0) 
vp3 <- viewport(width = unit(0.2,"npc") , x = 0.9 , y = 0.5) 
pushViewport(vp3) 
grid.draw(legend) 
popViewport() 

enter image description here

+0

Cảm ơn rất nhiều. Mặc dù giải pháp lâu hơn nó thực hiện công việc. Hai (người mới) câu hỏi: 1) Làm các đơn vị chiều rộng tổng hợp đến 1? Đối số 'respect' là gì? – radek

+2

Tôi thấy đối số chỉnh sửa hơi khó hiểu, nhưng về cơ bản tôi coi nó là ma trận tỷ lệ khung hình cho mỗi khung nhìn, vì vậy chúng tôi có '1,1,1' vì chúng ta có 1 hàng và 3 cột và chúng ta muốn 1: 1 tỷ lệ khung hình trong mỗi. Điều đó có thể không * khá * cách nó hoạt động, nhưng nó giúp tôi !!! Các đơn vị chiều rộng không * có * để tổng hợp đến 1. Bạn có thể ép chúng vào trong ít hơn chiều rộng của khu vực vẽ đồ thị. "npc" là từ 0 đến 1, với 0 cạnh trái hoặc dưới của vùng ô và 1 cạnh phải hoặc trên cùng và 0,5 tâm. Quy mô tương ứng.] –

+0

Siêu. Tất cả rõ ràng bây giờ. Cảm ơn bạn. – radek

23

Hãy thử điều này, trong đó sử dụng cbind.gtable:

grid.draw(cbind(ggplotGrob(p3), ggplotGrob(p2), size="last")) 

enter image description here

+2

+1 Tôi có khoảng 20 dòng mã mà tôi vừa mới dán để hoàn thành cùng một điều với một chút không thích hợp. Tôi muốn * Tôi đã biết về 'cbind.gtable' trước đây. Cảm ơn. –

+0

@Josh Cảm ơn bạn. Giải pháp tuyệt vời thực sự. Nhưng (giống như Simon, tôi cần phải hỏi về tỉ lệ khía cạnh - có thể bảo tồn được không? – radek

+1

@ SimonO101 - Câu hỏi hay. Không giống như nó cung cấp cho điều đó. Nếu một trong các bạn muốn theo đuổi điều này, tôi có thể đề nghị nhìn vào 'getAnywhere (" cbind_gtable ")', đó là nơi các đơn vị xuất hiện để được thiết lập, và nơi bạn có thể muốn sửa đổi mã. –

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