我有一个列表p
,其中p
的每个元素都是ggplot2绘图对象的列表。
我想输出一个包含p
中所有图表的pdf,以便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])
}
答案 0 :(得分:18)
此解决方案与列表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 :(得分:11)
这是一个简单版本的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 :(得分:3)
这是一个解决方案,但我并不特别喜欢它:
ggsave("test.pdf", do.call("marrangeGrob", c(unlist(p,recursive=FALSE),nrow=2,ncol=1)))
问题在于它依赖于每组中有相同数量的图。如果all(sapply(p, length) == 2)
为假,则会中断。
答案 3 :(得分:3)
一个适用于我的解决方案,适用于ggpubr
软件包(Github上的软件包,安装代码:devtools::install_github("kassambara/ggpubr")
)。
假设您有4个图p1,p2,p3和p4。
library(ggpubr)
multi.page <- ggarrange(p1,p2,p3,p4, nrow=1, ncol=1) # for one plot per page
multi.page[[1]] # for seeing the first plot
ggexport(multi.page, filename="my-plots.pdf")
答案 4 :(得分:2)
这是基于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 :(得分:2)
这是使用ggplot2::ggsave()
和gridExtra::marrangeGrob()
将ggplot对象列表导出到单个pdf文件中的最优雅的解决方案。
library(ggplot2)
library(gridExtra)
假设您使用lapply()
p <- lapply(names(mtcars), function(x) {
ggplot(mtcars, aes_string(x)) +
geom_histogram()
})
保存p
个图的列表:
ggsave(
filename = "plots.pdf",
plot = marrangeGrob(p, nrow=1, ncol=1),
width = 15, height = 9
)
答案 6 :(得分:1)
我尝试了其中一些解决方案,但没有成功。我进行了更多研究,找到了最适合我的解决方案。它将我所有的图形保存在一个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()
答案 7 :(得分:0)
没有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")