我正在尝试从ggplots列表生成ggplots网格的多页pdf。我已经尝试了很多方法来做到这一点并没有成功。这是一个可重复的等同于我一直在使用的东西:
library(ggplot2)
# generate a data frame w same structure as the one I'm working with
time <- c(1:10)
veclist <- list()
veclist[[1]] <- time
for (i in 2:25){
veclist[[i]] <- as.vector(c(runif(10,-2,2)))
}
d <- as.data.frame(do.call(rbind, veclist))
d <- as.data.frame(t(d))
colnames(d)[1] <- "time"
for (i in 2:length(d)){
colnames(d)[i] <- paste("name",i,sep=" ")
}
# for a common axis
numericvalues <- d[,2:length(d)]
# generate plot(s)
name_list = paste("`",names(d),"`",sep="")
plot_list = list()
for (i in 2:length(d)) {
p = ggplot(d, aes_string(x=name_list[[1]], y=name_list[[i]])) +
geom_point() +
labs(x="time",title=paste(strwrap(names(d[i]), width = 30),collapse = "\n")) +
theme(plot.title = element_text(size=10,hjust = 0.5),axis.text.x=element_text(size=6)) +
coord_cartesian(ylim = c(min(numericvalues, na.rm = TRUE), max(numericvalues, na.rm = TRUE)))
plot_list[[i]] = p
}
我正在寻找的是在plot_list中生成多页pdf网格图(理想情况下每页有3列,每行4行)。
我尝试过的一些事情:
pdf("test.pdf")
do.call("marrangeGrob",c(plot_list,ncol=3,nrow=2))
生成一个不可读的pdf文件。
pdf("test.pdf")
do.call("grid.arrange",c(plot_list))
只返回&#39; grobs&#39;允许进入&#34; gList&#34;错误。
答案 0 :(得分:2)
这个产生多页布局:
library(gridExtra)
...
plot_list = list()
for (i in 2:length(d)) {
p = ggplot(...)
plot_list[[i]] = ggplotGrob(p)
}
class(plot_list) <- c("arrangelist", class(plot_list))
ggsave("multipage.pdf", plot_list)
答案 1 :(得分:2)
你的情节清单似乎有一个缺失的项目。这是一个最小的例子
library(ggplot2)
pl <- replicate(13, ggplot(), simplify = FALSE)
ggsave("mp.pdf", gridExtra::marrangeGrob(grobs = pl, nrow=3, ncol=2))
注意:
dev.off()
因此无效的pdf do.call
,使用grobs参数答案 2 :(得分:1)
以下是gridExtra
和tidyr
(i)将宽数据转换为长格式,并根据每个名称拆分成data.frame列表:
library(tidyr)
df <- d %>% gather(var, val, -time)
df_list <- split(df, df$var)
(ii)使用lapply函数绘制每个名称
plots <- lapply(names(df_list), function(x){
ggplot(df_list[[x]], aes(time, val)) +
geom_point() +
labs(x="time", title=x)
})
(iii)使用gridExtra在pdf的两页上打印12个图:
library(gridExtra)
pdf("something.pdf")
do.call(grid.arrange, c(plots[1:12], nrow=4))
do.call(grid.arrange, c(plots[13:24], nrow=4))
dev.off()