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