2014-10-21 3 views
0

Я хочу сохранить изменяющийся набор ggplot - это разные файлы. Для этого я использую для цикла ищет что-то вроде этого:Сохранить несколько ggplots в файлах

save = c("plot1","plot2") 
for (i in 1:length(save)){ 
    ggsave(cat(save[i],"\n"), file="i.pdf") 
} 

«Plot1» и «Plot2» работают ggplots (= имена объектов сюжета). Потому что я получил следующую ошибку:

Error in ggsave(cat(save[i], "\n"), file = "i.pdf") : 
    plot should be a ggplot2 plot 

Я пробовал функцию кошки. Он возвращает ту же ошибку с или без функции. Если я вхожу в «график» напрямую, он работает ...

Что я делаю неправильно?

(ред пример, так что более одного участка)

+0

'c (" plot ")' - одноэлементный вектор символов. Вы передаете строку с новой строкой в ​​первый параметр 'ggsave', который ожидает имя файла. – hrbrmstr

+0

Но как бы это сделать, если в этом вето есть более одного элемента? save = c ("plot1", "plot2") – user3347232

+0

Можете ли вы показать еще какой-нибудь код? Являются ли названия объектов сюжета? – hrbrmstr

ответ

2

Вы должны указать аргумент участок в ggsave:

ggsave(plot = plot, file = "save.pdf") 

Если у вас есть несколько ggplot вам нужно сохранить их в списке первый.

plotlist = list() 
plotlist[[1]] = plot1 
plotlist[[2]] = plot2 

etc. или любым другим способом. После того, как вы в конечном итоге со списком вы можете петля на нем:

for(i in 1:2){ 
    ggsave(plot = plot[[i]], file = paste("file",i,".pdf",sep="")) 
} 

Это позволит вам сэкономить участки в file1 file2 и т.д.

+0

Это работает для меня. Спасибо. Еще одна вещь, хотя ... Как можно Я называю файлы в соответствии с элементами списка? Как и plot1.pdf, plot2.pdf ... – user3347232

+0

Вышеупомянутый код будет сохранен как file1.pdf, file2.pdf и т. Д., Если вы измените строку на: 'ggsave (plot = plot [[i]], file = paste ("plot", i, ". pdf", sep = "")) 'он будет делать сохранение как plot1.pdf plot2.pdf и т. д. Попробуйте запустить' i = 1 'и затем' paste ("plot", i, ". pdf", sep = "")) 'вы поймете, что вставка только создает правильный файл имени, используя ваш индекс i – Romain

+0

, поэтому я не могу получить строку из список? Можно сказать, что мы не говорим о plot1 и plot2, но abc и def. Как имена файлов будут abc.pdf и def.pdf? – user3347232

2

Вы можете использовать get получить объект на основе имени:

library(ggplot2) 

plot_1 <- qplot(mpg, wt, data = mtcars) 
plot_2 <- qplot(mpg, wt, data = mtcars, geom="path") 
plot_3 <- qplot(mpg, data = mtcars, geom = "dotplot") 

plot_names <- c("plot_1", "plot_2", "plot_3") 

for (i in 1:length(plot_names)) { 
    ggsave(filename=sprintf("%s.pdf", plot_names[i]), 
     plot=get(plot_names[i])) 
} 

Но, вы действительно лучше хранить свои участки в list и итерация по списку элементов:

plots <- list(length=3) 
plots[[1]] <- qplot(mpg, wt, data = mtcars) 
plots[[2]] <- qplot(mpg, wt, data = mtcars, geom="path") 
plots[[3]] <- qplot(mpg, data = mtcars, geom = "dotplot") 

for (i in 1:length(plots)) { 
    ggsave(filename=sprintf("plot%d.pdf", i), 
     plot=plots[[i]]) 
} 

Их можно сохранить, если вы хотите использовать имя графика в качестве вывода или добавить элемент списка для имени.

Смежные вопросы