Я построил анимированный график, используя 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()
Спасибо!