【问题标题】:Plotting over multiple pages在多个页面上绘图
【发布时间】:2016-08-30 02:48:28
【问题描述】:

我正在尝试编写一个在多个页面上绘制 ggplot facet_wrap 的函数。这只是一个 hack,因为此功能似乎在 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()

我的问题是,通过在 pdf()dev.off() 函数之间将它全部包装在这样的 for 循环中,for 循环似乎并没有等待 ggplot 执行它的操作,并快速通过其循环并输出无效的PDF。

如果我设置i = 1,则启动pdf(),在for循环中运行上面的代码,然后设置i=2,然后运行代码,依此类推,直到我感到无聊(i=3)然后转关闭设备,生成的 PDF 非常棒。

有没有办法让 for 循环等待最后一行完成绘图,然后再进行下一次迭代?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

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

    【讨论】:

    • 哇,这完全有效。我不知道打印可以这样使用。
    • 这是因为p 是一个对象。您的代码的最后一行修改了p 对象,但是您想将其print() 发送到设备。
    • 是的,这是一个常见的障碍。有时我在 ggplot2 中编写一个函数,并在最后一部分省略print(),因此没有输出......
    • 我认为我们都犯了这个错误。几个月前我发布了一个几乎相同的问题:stackoverflow.com/questions/2277166/saving-dotplot-to-pdf-in-r
    • 嘿……我也是。交互式控制台的缺陷之一。
    【解决方案2】:

    没错。 ggplot2 书的第 39 页告诉我们,当您创建 ggplot2 对象时,您可以“使用 print() 在屏幕上渲染它。这在交互式运行时会自动发生,但在循环或函数中,您需要 print()自己做”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      相关资源
      最近更新 更多