Как в ggplot2 организовать цикл по двум столбцам для создания графиков в группах?

Как я могу исправить ошибку при использовании функции ggplot в цикле для создания графиков ggplot2 для каждой группы (по штатам), и как автоматически сохранить каждый график в виде PDF в указанную папку? У меня есть код, который использует пакет purrr, но он выдает ошибку связную с fortify().

Вот пример моего кода:

library(tidyverse)

# создание синтетических данных
set.seed(321)
statenames <- c("state1","state2","state1","state2","state1","state2")
distnames <- c("dist1","dist2","dist3","dist4","dist5","dist6")
hcrv <- rnorm(n=6,mean = 10, sd=2)
intv <- rnorm(n=6,mean = 100, sd=20)
rdiv <- rnorm(n=6,mean = 150, sd=2)

plotdata <- cbind.data.frame(statenames, distnames, hcrv, intv, rdiv)

# попытка создания графиков по каждому штату с использованием ggplot2 и purrr
plotdata %>%
  pivot_longer(cols = -c(statenames, distnames), names_to = "indicatorName", values_to = "indicatorValue") %>% 
  group_split(statenames) %>%
  purrr::map(ggplot(., aes(x=indicatorName, y=indicatorValue)) + geom_col())

Я также хотел бы автоматически сохранять каждый график в формат PDF с именем файла, содержащим имя штата. Как это можно сделать в R с использованием ggplot2 и, возможно, дополнительных библиотек? Буду признателен за любые советы!

Привет! Попробуем разобраться с твоей задачей. В этом примере ты хочешь генерировать графики для каждой группы данных и сохранять их в PDF. Ошибка, связанная с fortify(), скорее всего связана с тем, что ты передаёшь результаты group_split() без явного указания, что они должны быть обработаны отдельно. Давай посмотрим, как это можно исправить и автоматизировать сохранение графиков.

Вот исправленный пример твоего кода:

library(tidyverse)

# Создание синтетических данных
set.seed(321)
statenames <- c("state1","state2","state1","state2","state1","state2")
distnames <- c("dist1","dist2","dist3","dist4","dist5","dist6")
hcrv <- rnorm(n=6, mean=10, sd=2)
intv <- rnorm(n=6, mean=100, sd=20)
rdiv <- rnorm(n=6, mean=150, sd=2)

plotdata <- cbind.data.frame(statenames, distnames, hcrv, intv, rdiv)

# Функция для создания и сохранения графика
create_and_save_plot <- function(data, state_name) {
  plot <- ggplot(data, aes(x=indicatorName, y=indicatorValue)) + 
    geom_col() + 
    ggtitle(paste("State:", state_name))
  
  ggsave(filename = paste0("charts/", state_name, "_plot.pdf"), plot = plot, 
         width = 8, height = 6)
}

# Создание графиков и их сохранение
plotdata %>%
  pivot_longer(cols = -c(statenames, distnames), names_to = "indicatorName", values_to = "indicatorValue") %>%
  group_split(statenames) %>%
  walk(~ create_and_save_plot(.x, unique(.x$statenames)))

Вот что мы сделали:

  1. Создали вспомогательную функцию create_and_save_plot, которая принимает данные и имя штата, создаёт график и сохраняет его в виде PDF.
  2. Использовали group_split() для разделения данных по штатам и передали каждый фрагмент данных в create_and_save_plot с помощью функции walk() из пакета purrr.
  3. Добавили ggsave() для сохранения графиков. Не забудь создать папку charts в текущем рабочем каталоге или заменить на другую существующую директорию, куда будут сохраняться PDF файлы.

Теперь каждый раз, когда ты выполняешь этот код, он будет генерировать и сохранять графики для каждого из штатов в отдельные PDF файлы. Удачи! . Я ответил на ваш вопрос?

Спасибо за ответ! У меня все получилось, и я смог успешно организовать цикл по двум столбцам для создания графиков в группах с помощью ggplot2.Спасибо за ответ! У меня все получилось, и я смог успешно организовать цикл по двум столбцам для создания графиков в группах с помощью ggplot2.

Конечно! Здорово слышать, что у тебя всё получилось. Если появятся ещё вопросы или потребуется помощь с другими аспектами ggplot2 или чем-то ещё, не стесняйся — обращайся. Удачи в дальнейшем анализе данных и создании визуализаций! :tada::bar_chart: . Я ответил на ваш вопрос?