Печать нескольких ggplots в один PDF, несколько графиков на страницу - программирование

Печать нескольких ggplots в один PDF, несколько графиков на страницу

У меня есть список, 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])
}
4b9b3361

Ответ 1

Это решение не зависит от того, отличаются ли длины списков в списке 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 сохраняет все графики, появляющиеся последовательно в одном файле (одна страница для одного изображения).

Ответ 2

Вот более простая версия решения 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()

Ответ 3

Здесь одно решение, но мне это не особенно нравится:

ggsave("test.pdf", do.call("marrangeGrob", c(unlist(p,recursive=FALSE),nrow=2,ncol=1)))

Проблема заключается в том, что она полагается на то, что в каждой группе имеется одинаковое количество графиков. Если all(sapply(p, length) == 2) были ложными, тогда он сломался.

Ответ 4

Здесь функция, основанная на подходе 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)
}

Ответ 5

Хорошее решение без пакета 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")

Ответ 6

Я пробовал некоторые из этих решений, но безуспешно. Я немного больше исследовал и нашел решение, которое отлично сработало для меня. Он сохраняет всю мою графику в одном файле 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()