Ускорение ggplot2-графика для анимированных графиков в большом наборе данных

Я построил анимированный график, используя ggplot2 и magick из большого набора данных, содержащего десятки тысяч записей.

Основываясь на моем сообщении Как управлять параллельной обработкой с помощью анимированный ggplot2-plot?, меня сейчас больше волнует не ускорение процесса построения графика, а процесс сохранения графика с использованием параллельной обработки через snowfall, так как это самая трудоемкая часть кода . Проблема в том, что для сохранения графика необходимо просмотреть все графики в списке, что делает код очень медленным.

Вот пример кода, демонстрирующий мою проблему:

library(parallel)
library(snowfall)
library(ggplot2)
library(magick)

# creating some sample data for one year
# 4 categories; each category has a specific value per day
set.seed(1)
x <- data.frame(
  rep(as.Date((Sys.Date()-364):Sys.Date(), origin="1970-01-01"),4),
  c(rep("cat01",length.out=365),
    rep("cat02",length.out=365),
    rep("cat03",length.out=365),
    rep("cat04",length.out=365)),
  sample(0:50,365*4, replace=TRUE)
)
colnames(x) <- c("date", "category", "value")
x$category <- factor(x$category)

# creating a cumulative measure making the graphs appear "growing"
x$cumsum <- NA
for(i in levels(x$category)){
  x$cumsum[x$category == i] <- cumsum(x$value[x$category == i])
}
x <- x[order(x$date),]

# number of cores
cores <- detectCores()

# clustering
sfInit(parallel = TRUE, cpus = cores, type = "SOCK")

# splitting data for plotting
datalist <- split(x, x$date)

# making everything accessible in the cluster
sfExportAll()
sfLibrary(ggplot2)
sfLibrary(magick)

# plotting
out <- sfLapply(datalist, function(data){
  plot <- ggplot(data)+
    geom_bar(aes(category, cumsum), stat = "identity")+
    # holding breaks and limits constant per plot
    scale_y_continuous(expand = c(0,0), 
                       breaks = seq(0,max(x$cumsum)+500,500), 
                       limits = c(0,max(x$cumsum)+500))+
    ggtitle(data$date)
plot
})
# accessing changed data
sfExportAll()

# opening magick-device
img <- image_graph(1000, 700, res = 96)

sfLapply(names(out), function(x){out[[x]]}) 

dev.off()

# animation
animation <- image_animate(img, fps = 5)
animation

# closing cluster
sfRemoveAll()
sfStop()

Любые предложения, как ускорить процесс сохранения?

Меня беспокоит скорость этих строк:

img <- image_graph(1000, 700, res = 96) 
sfLapply(names(out), function(x){print(out[[x]])}) 
dev.off()

Благодарю вас!


person alex_555    schedule 05.06.2018    source источник
comment
Где создается out?   -  person jay.sf    schedule 05.06.2018
comment
Пожалуйста, не дублируйте сообщения по очень похожему вопросу. Или решите первый и процитируйте его, например, если вы хотите улучшить данный ответ.   -  person F. Privé    schedule 05.06.2018
comment
@jaySf out создается во время печати.   -  person alex_555    schedule 06.06.2018
comment
@Ф. Privé Извините, я думал, что вопросы имеют разные проблемы (скорость печати против скорости сохранения). Я процитировал вопрос и постараюсь решить первый как можно скорее. Спасибо за ваш комментарий!   -  person alex_555    schedule 06.06.2018