Я пытаюсь построить несколько графиков, используя их 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()?
png(); grid.arrange(); ggplot(); ggplot(); dev.off()
print(ggplot())
?ggplot
используяggsave()
, разрешение изображения гораздо выше. Есть ли способ сохранить выходные данныеgrid.arrange()
с высоким разрешением, как если бы это был один сохраненный графикggsave()
? Если я приведу, например, параметры,png(...,height=1600, width=2500)
изображение выглядит очень размытым.Ответы:
grid.arrange
рисует прямо на устройстве.arrangeGrob
с другой стороны, ничего не рисует, но возвращает гробg
, который вы можете передатьggsave(file="whatever.pdf", g)
.Причина, по которой он работает иначе, чем с объектами ggplot, где по умолчанию последний график сохраняется, если он не указан, заключается в том, что ggplot2 незаметно отслеживает последний график, и я не думаю, что
grid.arrange
следует связываться с этим счетчиком, закрытым для пакета.источник
plot(g)
это не правильный способ отображения gtable, используйтеgrid.draw(g)
вместо этого.g <-arrangeGrob(...)
сprint(g)
вы получите текстовую таблицу со списком графических объектов , а не графики. Попробуйтеgrid.draw(g)
сделать графику как графику. -У меня были некоторые проблемы с предложением babptiste, но я получил его наконец. Вот что вы должны использовать:
Это должно работать хорошо.
источник
Другой простой способ сохранить grid.arrange в pdf-файл - это использовать pdf ():
Это позволяет объединять в расположении другие вещи, кроме ggplots, например таблицы ...
источник
Я думал, что это стоит добавить к этому. У меня были проблемы с вышесказанным, с ggsave выдает ошибку: "plot должно быть ggplot2 plot"
Благодаря этому ответу: Сохранение графика с помощью ggsave после использования ggplot_build и ggplot_gtable У меня есть поправка к приведенному выше коду.
Приведенная выше строка необходима для исправления ошибки
Теперь у меня все работает нормально.
источник
Вам не нужно использоватьrangeGrob, вы можете назначить результат grid.arrange непосредственно на график и сохранить его с помощью ggsave:
источник
Еще одно простое решение: сразу после вашего
grid.arrange()
ты делаешь
dev.copy()
источник