Сохранение файла grid.arrange() в файл

Я пытаюсь построить несколько графиков с помощью ggplot2, упорядочив их с помощью grid.arrange(). Поскольку мне удалось найти кого-то, описывающего точную проблему, которую я имею, я привел описание проблемы из link:

Когда я использую ggsave() после grid.arrange(), т.е.

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

Я не сохраняю график сетки, а последний отдельный ggplot. Есть ли способ фактического сохранения графика, отображаемого с помощью grid.arrange(), используя ggsave() или что-то подобное? Помимо использования более старого способа

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

Эта же ссылка дает решение ниже:

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

Однако я не могу понять, как использовать ggsave() для сохранения вывода вызова grid.arrange() в следующем коде, который берется из 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()?

Ответ 1

grid.arrange рисует прямо на устройстве. arrangeGrob, с другой стороны, ничего не рисует, а возвращает grob g, который вы можете передать на ggsave(file="whatever.pdf", g).

Причина, по которой она работает иначе, чем с объектами ggplot, где по умолчанию последний график сохраняется, если не указан, заключается в том, что ggplot2 невидимо отслеживает последний сюжет, и я не думаю, что grid.arrange должен испортить это счетчик, закрытый для пакета.

Ответ 2

У меня были некоторые проблемы с предложением babptiste, но я получил его наконец. Вот что вы должны использовать:

 # 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

Это должно хорошо работать.

Ответ 3

Еще один простой способ сохранить grid.arrange в pdf файле - использовать 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

Он позволяет объединить другие вещи, кроме ggplots в расположении, например таблицы...

Ответ 4

Я думал, что стоит добавить к этому. У меня были проблемы с вышеупомянутым, с ggsave, вызвавшим ошибку: "Сюжет должен быть графиком ggplot2"

Благодаря этому ответу: Сохранение графика с помощью ggsave после использования ggplot_build и ggplot_gtable У меня есть поправка к вышеуказанному коду.

  # 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]

Вышеприведенная строка, необходимая для исправления ошибки

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

Теперь это работает для меня хорошо.