2013-06-12 4 views
90

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

Когда я использую 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()? 
+5

Используйте 'png(); grid.arrange(); ggplot(); ggplot(); dev.off() ' – Andrie

+1

Не' print (ggplot()) '? –

+0

@DWin Да, наверное!:-) – Andrie

ответ

91

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

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

+0

Спасибо! Это именно то, что я искал. –

+1

Когда я пытаюсь это сделать, я получаю сообщение о том, что g не соответствует типу? –

+0

@JackAidley задает новый вопрос с минимальным самодостаточным воспроизводимым примером и вашим sessionInfo() (убедитесь, что у вас есть последние версии R и пакетов). – baptiste

24

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

# 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 

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

4

Я думал, что стоит добавить к этому. у меня были проблемы с выше, с ggsave выдавать ошибку: «участок должен быть ggplot2 участок»

Благодаря этому ответу: Saving a graph with ggsave after using ggplot_build and 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 

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

+0

Мне это было нужно. По-видимому, версия для разработки ggplot2 удаляет класс-тест-ошибку, как это, но версия CRAN в настоящее время (2015-10-21) не делает. –

+2

Это работает с marrangeGrob для меня, но не с arrGrob или grid.arrange. @ DaveX, вам нужно было сделать что-нибудь еще, чтобы заставить его работать, кроме изменения ggsave, как показано выше? Благодаря! – k13

14

Другой простой способ сохранить 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 в расположении, как таблицы ...