将每组的绘图和表格输出到同一页面

Output Plot and Table to Same Page for Each Group

提问人:user3466328 提问时间:12/6/2014 最后编辑:Karolis Koncevičiususer3466328 更新时间:6/14/2018 访问量:1082

问:

我正在尝试将每个组的图形和表格输出到 PDF 的一页(每组一页)。我快到了,但我只是在最后一步遇到了麻烦。我在同一页上有一个表格和一个绘图,但表格在绘图的顶部。当我将它移出绘图窗口时,它消失了。

有没有办法将图形放在绘图下方(在绘图窗口之外)?

这是我的代码:

lss <- read.csv(file="WithBlanksFilled_4.csv",head=TRUE, sep=",") # read in csv and name columns
st<-lss$server_type
tenant <- lss$tenant_n
date<- lss$date_time
ss <- lss$Max_load_source_size

df1 <- data.frame(st, tenant, date, ss)


#Create graph which will then be populated by output of dlply
library(ggplot2)
library(scales)
library(grid)
library(gridExtra)
library(gtable)
p<-ggplot(df1, aes(x=as.Date(date, "%d/%m/%Y %H:%M"), y=ss))+geom_point()+labs(x="Date", y="Load Source Size")+facet_wrap(~st+tenant, ncol=1)+scale_x_date(breaks = date_breaks("week"), minor_breaks=date_breaks("1 day"), labels = date_format("%d-%b"), limits = c(as.Date("2014-09-06"), as.Date("2014-12-01"))) + theme(axis.text.x = element_text(size=5, color="grey"), plot.margin=unit(c(1,1,5,1), "cm"), panel.border=element_blank()) +ylim(0,NA) 
#p1 <- ggplot_gtable(ggplot_build(p))
#p1$layout$clip[p1$layout$name=="panel"] <- "off"

#Grouping by t&st
library(plyr)
plots<-dlply(df1, .(st, tenant), function(df1) p %+% df1 %+% annotation_custom(tableGrob(df1), ymin=-2, ymax=-2))

#outputting graphs  table to PDF.
pdf(file = file.path("<filepath>.pdf"), onefile=TRUE)

plots 

dev.off()
r ggplot2 plyr gridextra

评论


答:

0赞 baptiste 12/6/2014 #1

由于您希望 tableGrob 位于绘图面板之外而不是内部,因此不应使用 annotation_custom,而应安排 Grob 在页面上排列绘图和表格。然后,可以在 pdf 设备中逐页打印 grobs 列表。

library(plyr)
plots <- dlply(iris, "Species", function(d) {
               arrangeGrob(qplot(1,1), tableGrob(head(d)))
               })

pdf("multipage.pdf")
plots
dev.off()

评论

0赞 user3466328 12/6/2014
嗨,baptiste,感谢您的回复,我在其他线程上看到了您的一些代码,例如:stackoverflow.com/questions/9690648/...。但是我不知道把grid.arrange(...)放在哪里。问题是在用 dlply 的输出填充绘图/表后,没有地方可以包含 grid.arrange(...)
0赞 Heretic Monkey 12/6/2014
考虑添加更多关于如何解决 OP 问题的解释。事实上,这将被认为是一个低质量的答案。