Создание графиков в цикле с помощью 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)