33

dev.off()我想在调用 *很久之后将绘图附加到现有的 pdf 。在阅读了帮助文件并阅读了此处此处pdf()的问答之后,我很确定它不能在 R 中完成。但是,也许你们中的一些更聪明的人有一个我无法找到的解决方案。

pdf("Append to me.%03d.pdf",onefile=T)
plot(1:10,10:1) #First plot (page 1)
dev.off()
pdf("Append to me.%03d.pdf",onefile=T)
plot(1:10,rep(5,10)) #Want this one on page 2
dev.off()

*这不是上面链接的问题的重复,因为我想在 pdf 设备关闭后附加到 pdf 文件。

4

4 回答 4

23

您可以使用recordPlot将每个图存储listreplayPlot. 这是一个例子:

num.plots <- 5
my.plots <- vector(num.plots, mode='list')

for (i in 1:num.plots) {
    plot(i)
    my.plots[[i]] <- recordPlot()
}
graphics.off()

pdf('myplots.pdf', onefile=TRUE)
for (my.plot in my.plots) {
    replayPlot(my.plot)
}
graphics.off()
于 2012-11-07T16:46:28.970 回答
18

如果您愿意安装小型、免费、独立于平台的pdftk实用程序,您可以使用 R 的系统调用将所有图形拼接在一起:

## A couple of example pdf docs
pdf("Append to me.1.pdf")
plot(1:10,10:1)
dev.off()

pdf("Append to me.2.pdf")
plot(1:10,rep(5,10)) 
dev.off()

## Collect the names of the figures to be glued together
ff <- dir(pattern="Append to me")
## The name of the pdf doc that will contain all the figures
outFileName <- "AllFigs.pdf"

## Make a system call to pdftk
system2(command = "pdftk",
        args = c(shQuote(ff), "cat output", shQuote(outFileName)))

## The command above is equiv. to typing the following at the system command line
## pdftk "Append to me.1.pdf" "Append to me.2.pdf" cat output "AllFigs.pdf"
于 2012-11-07T16:49:50.310 回答
6

这是非常骇人听闻的,可能掩盖了我有限的 UNIX shell fu,但它适用于安装了pdfjam的 Fedora 17机器(不是 R 包,而是来自 YUM 存储库)

pdf("pdf1.pdf")
plot(1:10)
dev.off()

pdf("| pdfjoin --outfile \"pdf2.pdf\" && pdfjoin pdf1.pdf pdf2.pdf --outfile pdf1.pdf && rm pdf2.pdf")
plot(10:1)
dev.off()

R中的输出是:

> pdf("| pdfjoin --outfile \"pdf2.pdf\" && pdfjoin pdf1.pdf pdf2.pdf --outfile pdf1.pdf && rm pdf2.pdf")## && pdfunite joined.pdf tmp.pdf joined.pdf && rm tmp.pdf")
> plot(10:1)
> dev.off()
          ----
  pdfjam: This is pdfjam version 2.08.
  pdfjam: Reading any site-wide or user-specific defaults...
          (none found)
  pdfjam: No PDF/JPG/PNG source specified: input is from stdin.
  pdfjam: Effective call for this run of pdfjam:
          /usr/bin/pdfjam --fitpaper 'true' --rotateoversize 'true' --suffix joined --outfile pdf2.pdf -- /dev/stdin - 
  pdfjam: Calling pdflatex...
  pdfjam: Finished.  Output was to 'pdf2.pdf'.
          ----
  pdfjam: This is pdfjam version 2.08.
  pdfjam: Reading any site-wide or user-specific defaults...
          (none found)
  pdfjam: Effective call for this run of pdfjam:
          /usr/bin/pdfjam --fitpaper 'true' --rotateoversize 'true' --suffix joined --outfile pdf1.pdf -- pdf1.pdf - pdf2.pdf - 
  pdfjam: Calling pdflatex...
  pdfjam: Finished.  Output was to 'pdf1.pdf'.
null device 
          1

基本上,如果它是唯一的输入文件,pdfjoin则将从中获取输入,因此我将输出从管道传输到程序并使用参数指定输出文件。然后使用将原始PDF与刚刚创建的连接在一起,指定输出PDF是原始PDF的名称。stdinpdf()pdfjoin--outfile&&pdf1.pdfpdf2.pdfpdf1.pdf

于 2012-11-07T16:46:20.033 回答
2

我最近发现了这部出色的作品(没有试图声称它是我自己的)

https://jonkimanalyze.wordpress.com/2014/07/24/r-compile-png-files-into-pdf/

这并不是 OP 所要求的,但我喜欢它的原因是我经常有非常密集的散点图和其他对 pdf 中的窗口大小调整等反应不佳的图。但是我需要产生多页输出。因此,如果这些图是数据密集型的,我会将它们渲染为 .png,然后使用上述函数在最后重新组合。

merge.png.pdf <- function(pdfFile, pngFiles, deletePngFiles=FALSE) {

  pdf(pdfFile)

  n <- length(pngFiles)

  for( i in 1:n) {


    pngFile <- pngFiles[i]

    pngRaster <- readPNG(pngFile)

    grid.raster(pngRaster, width=unit(0.8, "npc"), height= unit(0.8, "npc"))

    if (i < n) plot.new()

  }

  dev.off()

  if (deletePngFiles) {

    unlink(pngFiles)
  }

}
于 2017-07-25T16:38:59.507 回答