Lưu biểu đồ Grid.arrange () vào tệp


137

Tôi đang cố gắng vẽ nhiều ô bằng cách sử dụng ggplot2, sắp xếp chúng bằng cách sử dụng grid.arrange(). Vì tôi đã tìm được ai đó mô tả chính xác vấn đề mà tôi gặp phải, tôi đã trích dẫn từ mô tả vấn đề từ liên kết :

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ó cách nào thực sự lưu cốt truyện như được hiển thị bằng grid.arrange()cách sử dụng ggsave()hoặc một cái gì đó tương tự không? Khác với cách sử dụng theo cách cũ

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

Liên kết tương tự đư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()để lưu đầu ra của grid.arrange()cuộc gọi trong đoạn mã sau, được lấy từ liên kết :

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()?

6
Sử dụngpng(); grid.arrange(); ggplot(); ggplot(); dev.off()
Andrie

2
Không phải print(ggplot())sao?
IRTFM

@DWin Vâng, có lẽ! :-)
Andrie

1
@Andrie Những gì bạn đề xuất hoạt động, nhưng độ phân giải của hình ảnh rất thấp. Khi tôi lưu một lần ggplotsử dụng ggsave(), độ phân giải của hình ảnh cao hơn nhiều. Có cách nào để lưu kết quả đầu ra grid.arrange()với độ phân giải cao, như sẽ là nếu nó là một âm mưu duy nhất được lưu với ggsave()? Nếu tôi cung cấp ví dụ các tùy chọn png(...,height=1600, width=2500)thì hình ảnh trông rất mờ.
Tôi thích Mã

Câu trả lời:


142

grid.arrangevẽ trực tiếp trên một thiết bị. arrangeGrobmặt khác, không vẽ bất cứ thứ gì ngoài việc trả lại một cú đánh g, mà bạn có thể vượt qua ggsave(file="whatever.pdf", g).

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


3
Khi tôi thử điều này, tôi nhận được một lỗi cho tôi biết rằng g không đúng loại?
Jack Aidley

@JackAidley hỏi một câu hỏi mới, với một ví dụ có thể tái tạo khép kín 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

3
@DaveX xin đừng lan truyền thông tin sai lệch này; plot(g)không đúng cách để hiển thị một gtable, sử dụng grid.draw(g)để thay thế.
baptiste

@baptiste Cảm ơn & làm lại: Lưu ý rằng nếu bạn cố gắng xem kết quả của g <-arrangeGrob(...)việc print(g)bạn nhận được một bảng văn bản liệt kê các đối tượng đồ họa thay vì đồ họa. Cố gắng grid.draw(g)kết xuất đồ họa như đồ họa. -
Dave X

7
gssave không hoạt động với (một số hoặc tất cả) các rãnh nữa.
vak

47

Tôi đã có một số vấn đề với đề nghị của babptiste, nhưng cuối cùng đã nhận được nó. Đâ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ẽ làm việc tốt.


24

Một cách dễ dàng khác để lưu lưới.arrange vào tệp 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 hợp nhất những thứ khác ngoài ggplots trong sắp xếp, như bảng ...


7

Tôi nghĩ rằng nó là giá trị thêm vào này. Tôi đã gặp vấn đề với những điều trên, với gssave tạo ra một lỗi: "cốt truyện nên là một âm mưu ggplot2"

Nhờ câu trả lời này: Lưu một biểu đồ với gssave sau khi sử dụng ggplot_build và ggplot_gtable tôi có một sửa đổi cho đoạn 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 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.


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

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

3

Bạn không cần phải sử dụng sortGrob, bạn có thể gán kết quả của Grid.arrange trực tiếp vào một âm mưu và lưu nó bằng cách sử dụng gssave:

p3 <- grid.arrange(p1,p2, nrow = 1)
ggsave("filename.jpg", p3)

2

Một giải pháp đơn giản khác: ngay sau khi bạn grid.arrange()

grid.arrange(plot1, plot2, plot3, nrow=3)

bạn làm một dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()
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.