Я использовал group_by
, do
и ggplot
- дважды - для создания двух простых dfs
даты (группы) и списка выходных данных ggplot
, большое спасибо за помощь в примерах на этом сайте. Упрощенный пример:
p1 <- df_i %>% group_by(Date) %>% do(
plots = ggplot(data = .) +
geom_line() #etc, hugely long and detailed ggplot call omitted for brevity, but it works fine
) # close do
Затем я могу присоединиться к этим dfs
,
p1 <- cbind(p1, p2[,2])
names(p1) <- c("Date", "Temp", "Light") #Temp & Light were both "plots" from above
И выполните цикл по строкам, сохраняя выходные данные в 1-рядном (верхний и нижний объект) ggarranged
png
:
for (j in 1:nrow(p1)) {
ggsave(file = paste0(p1$Date[j], ".png"),
plot = arrangeGrob(p1$Temp[[j]], p1$Light[[j]]),
device="png",scale=1.75,width=6.32,height=4,units="in",dpi=300,limitsize=TRUE)
}
Все идет нормально. Но природа не терпит for-loop
, поэтому я пытался сделать ggsaving
в group_by
, используя те же параметры параметров ggsave
, меняя только то, что необходимо, учитывая разницу в индексировании for-loop
и (как я понимаю) group_by
подмножества:
p1 %>% group_by(Date) %>%
ggsave(file = paste0(.$Date, ".png"),
plot = arrangeGrob(Temp, Light),...) #other params hidden here for brevity
Ошибка в grDevices::png(..., res = dpi, unit = "in"): неверный аргумент 'pointsize'
Если я добавлю pointsize=10
, он скажет «недопустимое значение bg»; добавить bg = "white"
:
Ошибка в check.options(new, name.opt = ".X11.Options", envir = .X11env): неверные аргументы в 'grDevices::png(..., res = dpi, unit = "in")' ( нужны именованные аргументы)
(Я также пытался понизить dpi
безрезультатно). Возможно, я делаю это неправильно, например. замена %>%
на %$%
в предложении Влада от magrittr
:
Error in gList(list(list(data = list(DateTimeUTCmin5 = c(915213660, 915213780, :
only 'grobs' allowed in "gList"
Это дает ту же ошибку с Date
и .$Date
в вызове ggsave
. Попытка воссоздать фреймворк do
:
p1 %>% group_by(Date) %>%
do(ggsave(file = paste0(.$Date, ".png"),"_", .$Date, ".png"),
plot = arrangeGrob(Temp, Light), #etc
Ошибка в аранжировкеGrob(Temp, Light): объект Temp не найден
p1 %>% group_by(Date) %>%
do(ggsave(file = paste0(.$Date, ".png"),"_", .$Date, ".png"),
plot = arrangeGrob(.$Temp, .$Light), #etc
Ошибка в gList(list(list(data = list(DateTimeUTCmin5 = c(915213660, 915213780, : в gList) разрешены только 'grobs'
Что дает ту же ошибку, если я использую %$%
.
Есть ли у кого-нибудь связанный стек понимания этих инструментов, чтобы они могли видеть, что я здесь делаю неправильно? Кажется, я должен быть близко, но я все больше блуждаю в темноте. Любые указатели очень ценятся. Заранее спасибо!
В равной степени, если люди рекомендуют другой подход, мне тоже интересно. Мне кажется, что я мог бы использовать lapply
(или parSapply
) вместо for-loop
на p1
df
. Операции над grouped dfs
опережают apply
операции?
[Редактировать: желаемый окончательный результат: ggsave выгружает 1 изображение (с 2 графиками на нем) за дату в указанную папку. По сути, если я смогу заставить ggsave работать в grouped_df, это должно быть так]