Вопрос:
У меня есть список, p, где каждый элемент p – это список объектов ggplot2 для построения объектов.
Я хотел бы вывести один PDF файл, содержащий все графики в p, так что графики в p[[1]] приведены на странице 1, графики в p[[2]] приведены на стр. 2 и т.д. Как я могу это сделать
Вот пример кода для предоставления вам структуры данных, с которой я работаю, – извинения за скучные графики, я выбрал переменные наугад.
require(ggplot2) p <- list() cuts <- unique(diamonds$cut) for(i in 1:length(cuts)){ p[[i]] <- list() dat <- subset(diamonds, cut==cuts[i]) p[[i]][[1]] <- ggplot(dat, aes(price,table)) + geom_point() + opts(title=cuts[i]) p[[i]][[2]] <- ggplot(dat, aes(price,depth)) + geom_point() + opts(title=cuts[i]) } Лучший ответ:
Это решение не зависит от того, отличаются ли длины списков в списке p.
library(gridExtra) pdf(«plots.pdf», onefile = TRUE) for (i in seq(length(p))) { do.call(«grid.arrange», p[[i]]) } dev.off()
Из-за onefile = TRUE функция pdf сохраняет все графики, появляющиеся последовательно в одном файле (одна страница для одного изображения).
Ответ №1
Вот более простая версия решения Sven для новичков R, которые иначе слепо использовали бы do.call и вложенные списки, которые им не нужны и не понимали. У меня есть эмпирические данные.:)
library(ggplot2) library(gridExtra) pdf(«plots.pdf», onefile = TRUE) cuts <- unique(diamonds$cut) for(i in 1:length(cuts)){ dat <- subset(diamonds, cut==cuts[i]) top.plot <- ggplot(dat, aes(price,table)) + geom_point() + opts(title=cuts[i]) bottom.plot <- ggplot(dat, aes(price,depth)) + geom_point() + opts(title=cuts[i]) grid.arrange(top.plot, bottom.plot) } dev.off() Ответ №2
Здесь одно решение, но мне это не особенно нравится:
ggsave(«test.pdf», do.call(«marrangeGrob», c(unlist(p,recursive=FALSE),nrow=2,ncol=1)))
Проблема заключается в том, что она полагается на то, что в каждой группе имеется одинаковое количество графиков. Если all(sapply(p, length) == 2) были ложными, тогда он сломался.
Ответ №3
Здесь функция, основанная на подходе Sven, включая документацию roxygen2 и пример.
#’ Save list of ggplot2 objects to single pdf #’ #’ @param list (list) List of ggplot2 objects. #’ @param filename (chr) What to call the pdf. #’ #’ @return Invisible NULL. #’ @export #’ #’ @examples #’ #plot histogram of each numeric variable in iris #’ list_iris = map(names(iris[-5]), ~ggplot(iris, aes_string(.)) + geom_histogram()) #’ #save to a single pdf #’ GG_save_pdf(list_iris, «test.pdf») GG_save_pdf = function(list, filename) { #start pdf pdf(filename) #loop for (p in list) { print(p) } #end pdf dev.off() invisible(NULL) } Ответ №4
Хорошее решение без пакета gridExtra:
library(plyr) library(ggplot2) li = structure(p, class = c(«gglist», «ggplot»)) print.gglist = function(x, …) l_ply(x, print, …) ggsave(li, file = «test.pdf») Ответ №5
Я пробовал некоторые из этих решений, но безуспешно. Я немного больше исследовал и нашел решение, которое отлично сработало для меня. Он сохраняет всю мою графику в одном файле PDF, каждый график на одной странице.
library(ggplot2) pdf(«allplots.pdf»,onefile = TRUE) for(i in glist){ tplot <- ggplot(df, aes(x = as.factor(class), y = value)) print(tplot) } dev.off()