2013-06-12 35 views
90

Tôi đang cố gắng vẽ nhiều lô bằng cách sử dụng ggplot2, sắp xếp chúng bằng cách sử dụng grid.arrange(). Kể từ khi tôi cố gắng tìm một ai đó mô tả các vấn đề chính xác tôi có, tôi đã trích dẫn từ mô tả vấn đề từ link:Lưu grid.arrange() lô vào tập tin

Khi tôi sử dụng ggsave() sau grid.arrange(), tức là

grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2) 
ggsave("sgcirNIR.jpg") 

tôi không lưu cốt truyện lưới nhưng ggplot cá nhân cuối cùng. Có bất kỳ cách nào thực sự tiết kiệm cốt truyện như được hiển thị bằng cách grid.arrange() sử dụng ggsave() hoặc một cái gì đó tương tự? khác vì sử dụng cách cũ

jpeg("sgcirNIR.jpg") 
grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2) 
dev.off() 

Liên kết cùng đưa ra giải pháp dưới đây:

require(grid) 
require(gridExtra) 
p <- arrangeGrob(qplot(1,1), textGrob("test")) 
grid.draw(p) # interactive device 
ggsave("saving.pdf", p) # need to specify what to save explicitly 

Tuy nhiên, tôi không thể tìm ra cách để sử dụng ggsave() để tiết kiệm đầu ra của grid.arrange() cuộc gọi trong đoạn mã sau, được lấy từ link:

library(ggplot2) 
library(gridExtra) 
dsamp <- diamonds[sample(nrow(diamonds), 1000), ] 

p1 <- qplot(carat, price, data=dsamp, colour=clarity) 
p2 <- qplot(carat, price, data=dsamp, colour=clarity, geom="path") 

g_legend<-function(a.gplot){ 
tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
legend <- tmp$grobs[[leg]] 
return(legend)} 

legend <- g_legend(p1) 
lwidth <- sum(legend$width) 

## using grid.arrange for convenience 
## could also manually push viewports 
grid.arrange(arrangeGrob(p1 + theme(legend.position="none"), 
             p2 + theme(legend.position="none"), 
             main ="this is a title", 
             left = "This is my global Y-axis title"), legend, 
        widths=unit.c(unit(1, "npc") - lwidth, lwidth), nrow=1) 

# What code to put here to save output of grid.arrange()? 
+5

Sử dụng 'png(); grid.arrange(); ggplot(); ggplot(); dev.off() ' – Andrie

+1

Không phải 'in (ggplot())'? –

+0

@DWin Có, có thể!:-) – Andrie

Trả lời

91

grid.arrange vẽ trực tiếp trên thiết bị. Mặt khác, arrangeGrob không vẽ bất kỳ thứ gì nhưng trả về grob g, bạn có thể chuyển đến ggsave(file="whatever.pdf", g).

Lý do nó hoạt động khác với đối tượng ggplot, theo mặc định ô cuối cùng được lưu nếu không được chỉ định, là ggplot2 theo dõi vô hình âm mưu mới nhất và tôi không nghĩ rằng grid.arrange sẽ gây rối với bộ đếm này riêng tư cho gói.

+0

Cảm ơn! Điều này thật đúng với gì mà tôi đã tìm kiếm. –

+1

Khi tôi thử điều này tôi nhận được một lỗi nói với tôi rằng g không phải là loại đúng? –

+0

@JackAidley đặt câu hỏi mới, với ví dụ có thể tái sản xuất tối thiểu và sessionInfo() của bạn (đảm bảo bạn có các phiên bản R và gói gần đây). – baptiste

24

Tôi đã gặp một số vấn đề với đề xuất của babptiste, nhưng cuối cùng cũng có được. Dưới đây là những gì bạn nên sử dụng:

# draw your plots 
plot1 <- ggplot(...) # this specifies your first plot 
plot2 <- ggplot(...) # this specifies your second plot 
plot3 <- ggplot(...) # this specifies your third plot 

#merge all three plots within one grid (and visualize this) 
grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid 

#save 
g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g 
ggsave(file="whatever.pdf", g) #saves g 

Điều này sẽ hoạt động tốt.

4

Tôi nghĩ rằng nó đáng để thêm vào điều này. Tôi đã có vấn đề với việc trên, với ggsave sản xuất một lỗi: "âm mưu phải là một âm mưu ggplot2"

Nhờ câu trả lời này: Saving a graph with ggsave after using ggplot_build and ggplot_gtable Tôi có một sửa đổi đối với mã trên.

# draw your plots 
plot1 <- ggplot(...) # this specifies your first plot 
plot2 <- ggplot(...) # this specifies your second plot 
plot3 <- ggplot(...) # this specifies your third plot 

#merge all three plots within one grid (and visualize this) 
grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid 

#save 
ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2] 

Dòng trên cần thiết để sửa chữa các lỗi

g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g 
ggsave(file="whatever.pdf", g) #saves g 

Bây giờ nó làm việc cho tôi tốt.

+0

Tôi cần điều này. Rõ ràng phiên bản phát triển của ggplot2 loại bỏ lỗi lớp thử nghiệm như thế này, nhưng phiên bản CRAN hiện tại (2015-10-21) thì không. –

+2

Điều này làm việc với marrangeGrob cho tôi nhưng không phải với arrangGrob hoặc grid.arrange @ DaveX, bạn có cần phải làm bất cứ điều gì khác để làm cho nó hoạt động bên cạnh việc sửa đổi ggsave như được hiển thị ở trên? Cảm ơn! – k13

14

Một cách dễ dàng để tiết kiệm một grid.arrange vào một tập tin pdf là sử dụng pdf():

pdf("filename.pdf", width = 8, height = 12) # Open a new pdf file 
grid.arrange(plot1, plot2, plot3, nrow=3) # Write the grid.arrange in the file 
dev.off() # Close the file 

Nó cho phép sáp nhập những thứ khác hơn ggplots trong việc bố trí, giống như bảng ...

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