Использование цикла for для сохранения нескольких ggplot как jpeg

Я хотел бы сохранить несколько ggplots как jpeg через цикл for. Но когда я попытался адаптировать код, который я написал для базовой команды построения графика, я не получил вывода (в моем рабочем каталоге ничего не сохраняется).

Например, это отлично работает:

library(cowplot)
library(ggplot)

X<-c(1,2,3,4,5,6,7,8,9)
Y1<-c(2,3,4,4,3,2,4,5,6)
Y2<-c(3,4,5,3,2,1,1,2,3)
Y3<-c(4,5,6,7,8,9,8,7,6)

DF<-data.frame(X,Y1,Y2,Y3)



for(i in 1:3){


    jpeg(paste(i,".jpeg",sep=""))
    plot(DF[,1],DF[,i+1])
    dev.off()
}

В итоге я получаю три файла jpeg, сохраненных в моем рабочем каталоге.

Я не уверен, как правильно проиндексировать здесь вызов ggplot для i, но даже это должно вернуть 3 экземпляра одного и того же сюжета:

for(i in 1:3){


    jpeg(paste(i,".jpeg",sep=""))
    ggplot(data=DF,aes(x=X,y=Y1))+geom_line()
    dev.off()
}

В конце концов, я надеялся объединить несколько графиков в один jpeg, а затем сохранить несколько jpeg следующим образом:

for(i in 1:3){


    jpeg(paste(i,".jpeg",sep=""))
    A<-ggplot(data=DF,aes(x=X,y=Y1))+geom_line()
    B<-ggplot(data=DF,aes(x=X,y=Y2))+geom_line()
    C<-ggplot(data=DF,aes(x=X,y=Y3))+geom_line()
    plot_grid(A,B,C)

    dev.off()
}

Таким образом, этот график также должен возвращать 3 экземпляра одного и того же графика, все с разными индексированными именами файлов. Но опять же, я ничего не получаю.

Итак, мой вопрос: почему в этом цикле for есть разница между общим построением графика и ggploting. И как можно сохранить несколько jpeg-файлов из ggplots, как указано выше?


person Vinterwoo    schedule 15.01.2017    source источник
comment
Смотрите ggsave()?   -  person Aurèle    schedule 15.01.2017
comment
Но я могу сохранить один график, как указано выше, вне цикла for. Так зачем мне ggsave внутри forloop, а не снаружи для одного вызова?   -  person Vinterwoo    schedule 15.01.2017
comment
я думаю, вам нужен print() вызов для вызовов ggplot и plot_grid или уже упомянутого ggsave. я не совсем уверен, но я предполагаю, что ggplot создает объекты ggplot, которые, если вы хотите сохранить их в файл, должны быть явно print-ed ...   -  person davidski    schedule 15.01.2017


Ответы (2)


Как насчет

library(gridExtra) # gridExtra::arrangeGrob

for(i in 1:3) {

    jpeg(paste0(i, ".jpg"))
    A <- ggplot(data = DF, aes(x = X, y = Y1)) + geom_line()
    B <- ggplot(data = DF, aes(x = X, y = Y2)) + geom_line()
    C <- ggplot(data = DF, aes(x = X, y = Y3)) + geom_line()
    grid.arrange(arrangeGrob(A, B, C, ncol = 3))
    dev.off()

}

Примечание. это решение не создает боковые аннотации cowplot («A», «B», «C»).

person Fr.    schedule 15.01.2017

используя ваш код:

for(i in 1:3){


    jpeg(paste(i,".jpeg",sep=""))
    A<-ggplot(data=DF,aes(x=X,y=Y1))+geom_line()
    B<-ggplot(data=DF,aes(x=X,y=Y2))+geom_line()
    C<-ggplot(data=DF,aes(x=X,y=Y3))+geom_line()
    k<-plot_grid(A,B,C)

    ggsave(k, filname = "path/finalplot.jpeg")
}

посмотрите на ?ggsave, чтобы посмотреть другие аргументы, которые нужно указать, например, height и width

person DataTx    schedule 15.01.2017
comment
У этого кода есть некоторые проблемы (jpeg не соответствует dev.off(), и ggsave сохраняется три раза по одному и тому же пути к файлу). - person Fr.; 17.01.2017