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


137

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

Когда я использую 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()вызова в следующем коде, который взят из ссылки :

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
Использованиеpng(); grid.arrange(); ggplot(); ggplot(); dev.off()
Андри

2
Нет print(ggplot())?
IRTFM

@DWin Да, наверное! :-)
Андри

1
@ Andri То, что вы предлагаете, работает, но разрешение изображения очень низкое. Когда я сохраняю один , ggplotиспользуя ggsave(), разрешение изображения гораздо выше. Есть ли способ сохранить выходные данные grid.arrange()с высоким разрешением, как если бы это был один сохраненный график ggsave()? Если я приведу, например, параметры, png(...,height=1600, width=2500)изображение выглядит очень размытым.
Мне нравится

Ответы:


142

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

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


3
Когда я пытаюсь это сделать, я получаю сообщение об ошибке, говорящее мне, что g не того типа?
Джек Эйдли,

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

3
@DaveX, пожалуйста, не распространяйте эту вводящую в заблуждение информацию; plot(g)это не правильный способ отображения gtable, используйте grid.draw(g)вместо этого.
Креститель

@baptiste Спасибо и переработано: Обратите внимание , что если вы пытаетесь увидеть результат g <-arrangeGrob(...)с print(g)вы получите текстовую таблицу со списком графических объектов , а не графики. Попробуйте grid.draw(g)сделать графику как графику. -
Дэйв Икс

7
ggsave больше не работает с (некоторыми или всеми) гробами.
Вак

47

У меня были некоторые проблемы с предложением 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

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


24

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


7

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

Благодаря этому ответу: Сохранение графика с помощью 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

Теперь у меня все работает нормально.


Мне это было нужно. Очевидно, что версия разработки ggplot2 удаляет class-test-fault, как это, но версия CRAN в настоящее время (2015-10-21) этого не делает.
Дэйв Икс

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

3

Вам не нужно использоватьrangeGrob, вы можете назначить результат grid.arrange непосредственно на график и сохранить его с помощью ggsave:

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

2

Еще одно простое решение: сразу после вашего grid.arrange()

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

ты делаешь dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.