Сохранение нескольких 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Это хороший признак того, что вы должны использовать список вместо.

Другие вопросы по тегам