跨多个页面绘图

26

我正在尝试编写一个函数,可以在多个页面上绘制 ggplot 的 facet_wrap 图。由于这个功能似乎在 ggplot2 的待办列表上,因此这只是一个技巧。我进行了一些小的计算,以确定我将需要的页面数,每页需要的 data.frame 行数等等。我相当有信心这一切都能够正常工作。

pdf(filename)
for (i in seq(num_pages)){
    slice = seq(((i-1)*num_rows)+1,(i*num_rows))
    slice = slice[!(slice > nrow(df.merged))]
    df.segment=df.merged[slice,]
    p <- ggplot(df.segment, aes(y=mean,x=phenotype))
    p <- p + geom_bar(stat="identity",fill="white",colour="black") 
    p + facet_wrap("ID",scales="free_y",ncol=n_facets,nrow=n_facets)
}
dev.off()
我的问题是,通过像这样将所有内容包装在一个for循环中,在pdf()dev.off()函数之间,for循环似乎不等待ggplot完成其操作,而是非常迅速地通过循环并输出无效的PDF。
如果我设置i=1,开始pdf(),在for循环中运行上述代码,然后设置i=2,再运行该代码,以此类推直到我厌倦为止(i=3),然后关闭设备,生成的PDF文件就很好。
请问是否有方法可以使for循环在移动到下一次迭代之前等待最后一行完成绘图?
2个回答

31

我认为问题在于你需要在你的最后一行代码(p+ ...)周围加上print(),以便它在for循环内实际打印到设备上。


哇,这完全可行。我从没想过print可以这样使用。 - Mike Dewar
这是因为p是一个对象。你代码的最后一行修改了p对象,但是你想要将其打印到设备上。 - JoFrhwld
是的,这是一个常见的障碍。有时我在ggplot2中编写一个函数,并在最后一部分省略了print(),因此没有输出... - aL3xa
我认为我们都会犯这个错误。几个月前,我发布了一个几乎完全相同的问题:https://dev59.com/xEzSa4cB1Zd3GeqPiwXr - Jared
呵呵,我也是。交互式控制台的一个缺陷之一。 - Matt Parker
class(p)的对象是否重载了print函数?我感觉我快要理解了什么... - Mike Dewar

6

没错。《ggplot2》书的第39页告诉我们,当你创建 ggplot2 对象时,可以使用 "print()" 将其 "呈现在屏幕上"。当交互式运行时,这会自动发生,但在循环或函数内部,你需要自己使用 "print()"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接