打印多ggplots成单一的PDF,每页多条曲线(Printing multiple ggplots

2019-06-17 23:43发布

我有一个列表, 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])
}

Answer 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保存在同一个文件(一个页面一个图形)中相继出现的所有的图形。



Answer 2:

这里是斯文的用于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()


Answer 3:

这里有一个解决办法,但我特别不喜欢它:

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

的问题是,它依赖于有被相同数目的每个组中的情节。 如果all(sapply(p, length) == 2)是假的,那么它会打破。



Answer 4:

下面是根据埃里克森的做法功能,包括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)
}


Answer 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()


Answer 6:

一个很好的解决方案,而不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")


文章来源: Printing multiple ggplots into a single pdf, multiple plots per page
标签: r ggplot2