Несколько графиков в PDF с использованием вложенных циклов в R - PullRequest
0 голосов
/ 25 февраля 2020

У меня вопрос об использовании циклов for для создания нескольких PDF-файлов фигур с использованием ggplot2 в R. У меня есть набор данных о качестве воды для нескольких станций отбора проб для большого количества параметров, попадающих в одну из нескольких групп.

Моя цель - создать отдельный файл PDF для каждой станции, содержащий несколько простых диаграмм рассеяния для каждого параметра, сгруппированных по группе параметров. Мой код ниже.

Изначально я использовал внутреннюю часть для l oop, чтобы сгенерировать графики для одной станции отбора проб и сохранить ее в PDF. Когда я вложил его во внешнее поле для l oop, я столкнулся с проблемой, когда вместо создания уникальных PDF-файлов, содержащих только данные для каждой станции отбора проб, он генерирует идентичные PDF-файлы для всех станций отбора проб, содержащих графики с данными для всех станций сверху друг с другом. Мне не удалось найти исправление, чтобы каждый PDF-файл содержал только данные этой станции.

full_set <- list.files(pattern = "*xlsx") %>% map_df(~read_excel(.))
full_set_annual_means <- full_set %>% group_by(Station, Group, Constituent, Year) %>% 
  summarize(annual_mean = mean(Monthly_Average))
for (st in unique(full_set_annual_means$Station)) {
  filename <- sprintf("%s plots.pdf", toString(st))
  pdf(file = filename, width = 10.5, height = 8, paper = "a4r")
  for (var in unique(full_set_annual_means$Group)) {
    print(ggplot(full_set_annual_means[full_set_annual_means$Group == var, ], aes(Year, annual_mean)) + 
          geom_point() + facet_wrap(~Constituent, scales = "free_y") + ggtitle(var))
}
dev.off()
}

Редактировать:

Я нашел способ заставить его работать так, как я планировал. Сначала я пытался отфильтровать данные по станции во внешнем для l oop, переназначив отфильтрованную версию набора данных переменной full_set_annual_means следующим образом:

full_set_annual_means <- full_set_annual_means %>% filter(Station == st)

Но тем самым я перезаписал полный набор данных с отфильтрованной версией, поэтому первая итерация l oop будет работать, а затем для оставшихся итераций l oop будет выводиться пустой файл PDF. Вместо этого сохранив отфильтрованные данные в качестве промежуточной переменной:

station_set <- full_set_annual_means %>% filter(Station == st)

Я сохранил полный набор данных для будущих итераций l oop. Вот обновленный код в полном объеме, который работал так, как я задумал:

full_set <- list.files(pattern = "*xlsx") %>% map_df(~read_excel(.))
full_set_annual_means <- full_set %>% group_by(Station, Group, Constituent, Year) %>% 
  summarize(annual_mean = mean(Monthly_Average))
for (st in unique(full_set_annual_means$Station)) {
 station_set <- full_set_annual_means %>% filter(Station == st)
   filename <- sprintf("%s plots.pdf", toString(st))
  pdf(file = filename, width = 10.5, height = 8, paper = "a4r")
  for (var in unique(station_set$Group)) {
    print(ggplot(station_set[station_set$Group == var, ], aes(Year, annual_mean)) + 
          geom_point() + facet_wrap(~Constituent, scales = "free_y") + ggtitle(var))
}
dev.off()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...