Создание графиков в цикле с помощью ggplot2

Мне нужно создать 250 графиков с одинаковым представлением.

Мой примерный набор данных:

df <- data.frame(name = c("john","alex","mike","dennis","alex"),
             expenses = c("10","12","15","8","2"),
             type = c("food","rent","rent","food","food"))

Я бы хотел, чтобы барные сюжеты оплачивали каждое имя в одном сюжете. Сюжет для "alex" будет выглядеть так:

selected.name <- "alex"
df1 <- subset(df, name == selected.name)
ggplot(data = df1, aes(type, expenses)) + geom_bar()

Теперь я хочу использовать цикл, который отображает один и тот же график для каждого имени в df. Я попытался использовать цикл for, который запускает вышеприведенный код в качестве исходного файла. Но я не могу передать переменную имени в исходный файл, чтобы он отображал график для каждого имени. Теперь я получаю только один график из цикла for.

Ответ 1

Чтобы ответить на ваш вопрос orignal. Для этого используйте стандартный R:

doPlot = function(sel_name) {
   dum = subset(df, name == sel_name)
   ggobj = ggplot(data = dum, aes(type, expenses)) + geom_bar()
   print(ggobj)
   ggsave(sprintf("%s.pdf", sel_name))
}
lapply(unique(df$name), doPlot)

Таким образом, вы получаете большое количество PDF файлов под названием Adam.pdf и т.д. Затем вы можете использовать pdftk (комплект инструментов pdf) для совместного использования файлов в одном документе. Я бы предпочел, лучшее решение с использованием, например, фацетирования или другого типа графика.

Не лучше ли было бы использовать фасетирование? Учитывая ваш пример, код будет выглядеть следующим образом:

ggplot(data = df, aes(type, expenses)) + 
   geom_bar() + facet_wrap(~name)

что приводит к следующему заговору:

enter image description here

Возможно, для 250 имен и более переменных это может быть проблемой. Но я все равно посмотрю на грань.

Ответ 2

Коллеж просто указал, что использование подмножества в функции - очень плохая идея. Подробнее см. ?subset(). Поэтому я адаптировал автора Paul Heemstra и заменил подмножество.

doPlot = function(sel_name) {
   dum <- df[df$name == sel_name,]
   ggobj = ggplot(data = dum, aes(type, expenses)) + geom_bar()
   print(ggobj)
   ggsave(sprintf("%s.pdf", sel_name))
}
lapply(unique(df$name), doPlot)