Сохранение нескольких ggplots из ls в один и отдельные файлы в R
У меня есть несколько ggplots как объекты на моем ls. Я хочу сохранить их как отдельные файлы (хотя мне также было бы интересно узнать, как сохранить их все под 1 большим файлом). Я прочитал это: вопрос и вопрос, но я не могу адаптировать код. Я также попытался отобразить их все в один большой файл, как предлагается здесь, но получаю эту ошибку: Error in do.call("grid.arrange", plots2[[i]]) : second argument must be a list
, Есть кое-что, чего мне не хватает, чтобы собрать все ggplots в одном списке.
Это то, что я пробовал до сих пор:
> ls() #List of objects on my ls. All the p* are my ggplots that I want to save.
[1] "all" "dat" "dat2" "dat3" "data" "dlook" "dlook2" "dlook3" "i" "look2" "mdfx"
[12] "objects" "order" "p" "p1" "p10" "p11" "p12" "p13" "p14" "p15" "p16"
[23] "p17" "p18" "p19" "p2" "p3" "p4" "p5" "p6" "p7" "p8" "p9"
> objects<-ls()
> plot<-objects[14:30]
> plots
[1] "p1" "p10" "p11" "p12" "p13" "p14" "p15" "p16" "p17" "p18" "p19" "p2" "p3" "p4" "p5" "p6" "p7" "p8" "p9"
> class(plots)
[1] "character"
plots2<-as.list(plots)#Transform into a list.
library(gridExtra) #Code suggested to create one pdf file.
pdf("test.pdf", onefile = TRUE)
for (i in seq(length(plots2))) {
do.call("grid.arrange", plots2[[i]])
}
dev.off()
4 ответа
Лучше всего иметь свои участки в списке
l = mget(plots)
Тогда вы можете просто распечатать их постранично,
pdf("all.pdf")
invisible(lapply(l, print))
dev.off()
или сохранить один график на файл,
invisible(mapply(ggsave, file=paste0("plot-", names(l), ".pdf"), plot=l))
или расположить их все на одной странице,
ggsave("arrange.pdf", arrangeGrob(grobs = l))
или расположить их 2х2 на нескольких страницах,
ggsave("arrange2x2.pdf", marrangeGrob(grobs = l, nrow=2, ncol=2))
и т.п.
(Непроверенные)
Обратите внимание, что вам не нужно работать с lapply. Предположим, у вас есть список всех ваших графиков:
MyPlots = list(plot1, plot2, plot3)
Просто используйте:
pdf("all.pdf")
MyPlots
dev.off()
Если участки p1
, p10
и т. д. уже существуют, и вы хотите, чтобы они были сохранены как p1.pdf
и т.д., тогда я думаю, что это должно сделать это:
lapply(plots,function(x){ggsave(file=paste(x,"pdf",sep="."),get(x))})
ggsave(...)
имеет ряд аргументов для указания размеров и формата выходного файла.
В качестве примера приведем комментарий Джорана и дополнение к ответу Баптиста, вот как вы должны инициализировать список и сохранять графики в списке заранее:
plots <- list()
plots[[1]] <- ggplot(...) # code for p1
plots[[2]] <- ggplot(...) # code for p2
## Depending on if your plots are scriptable, you could use a loop
for (i in 3:10) {
plots[[i]] <- ggplot(...) # code for plot i
}
Тогда этот список, plots
, соответствует l
в ответе крещения.
При использовании списков, одиночные скобки, [
, используются для подсписков, где вы должны использовать двойные скобки [[
чтобы получить элемент списка. Например, plots[[1]]
даст вам ggplot
объект, который является первым элементом plots
, но plots[1]
даст вам список длиной один, содержащий этот первый график в качестве элемента. Поначалу это может показаться странным, но это имеет смысл, особенно если вы просто хотите построить первые три графика, тогда вы можете использовать myplots[1:3]
вместо l
в любом из примеров крещения. (Увидеть ?"["
Больше подробностей.)
Всякий раз, когда вы ловите себя, называя переменные последовательно числами, например, x1
, x2
, x3
Это хороший признак того, что вы должны использовать список вместо.