Сохранение нескольких ggplots из ls в один и отдельные файлы в R

У меня есть несколько ggplots в качестве объектов на моем ls. Я хочу сохранить их как отдельные файлы (хотя мне также было бы интересно узнать, как сохранить их все в одном большом файле). Я прочитал это: вопрос и вопрос, но я не могу адаптировать код . Я также попытался построить их все в одном большом файле, как было предложено page">здесь, но получите эту ошибку: 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()

person GodinA    schedule 10.12.2013    source источник
comment
Ваша ссылка на второй вопрос указывает на то же, что и на первый. Кроме того, вы пытаетесь распечатать один график на странице PDF или расположить их на одной странице вместе?   -  person MattLBeck    schedule 10.12.2013
comment
Упс, извините, это исправим. Я хотел бы знать, как сделать оба варианта 1) отдельные pdf-файлы и 2) все в одном большом pdf-файле, по одному сюжету на страницу.   -  person GodinA    schedule 10.12.2013
comment
На данный момент вы, вероятно, хотите mget (также обратите внимание, что ls позволит вам использовать регулярное выражение для поиска элементов). Но, вероятно, было бы проще (и чище) сначала поместить все участки в предварительно выделенный список.   -  person joran    schedule 10.12.2013
comment
@joran, можешь показать мне, как составить список и назначить участки? Или порекомендуйте какие-либо ссылки/чтения о том, как это сделать?   -  person GodinA    schedule 10.12.2013
comment
@GodinA После того, как вы прочитали о mget и попробовали это, вам нужно полностью отказаться от цикла for. Суть do.call в том, что вы передаете ему функцию grid.arrange и весь список объектов ggplot, а он делает все остальное.   -  person joran    schedule 10.12.2013
comment
@joran, я бы предпочел изучить предложенный вами более простой и чистый способ сделать это, например, создать список на переднем плане. Буду искать.   -  person GodinA    schedule 10.12.2013


Ответы (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))

или расположите их 2x2 на нескольких страницах,

ggsave("arrange2x2.pdf", marrangeGrob(grobs = l, nrow=2, ncol=2))

и Т. Д.

(не проверено)

person baptiste    schedule 10.12.2013
comment
Это очень полезно - когда я пытаюсь использовать свой собственный пример, получается пустая страница. Любая идея, почему это произойдет? - person EntryLevelR; 17.04.2017

Обратите внимание, что вам не обязательно работать с lapply. Предположим, у вас есть список, содержащий все ваши графики:

MyPlots = list(plot1, plot2, plot3)

Просто используйте:

pdf("all.pdf")
MyPlots
dev.off()
person Rtist    schedule 27.07.2017

Если участки p1, p10 и т. д. уже существуют, и вы хотите, чтобы они были сохранены как p1.pdf и т. д., то я думаю, что это должно сделать это:

lapply(plots,function(x){ggsave(file=paste(x,"pdf",sep="."),get(x))})

ggsave(...) имеет ряд аргументов для указания размеров и формата выходного файла.

person jlhoward    schedule 10.12.2013

В качестве примера, конкретизирующего комментарий Джорана, и дополнения к ответу Батиста, вот как вы инициализируете список и сохраняете графики в списке заранее:

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 в любом из примеров baptiste. (Подробнее см. ?"[".)

Всякий раз, когда вы ловите себя на том, что последовательно называете переменные числами, например, x1, x2, x3, это хороший признак того, что вместо этого вам следует использовать список.

person Gregor Thomas    schedule 10.12.2013