Comment ajouter un tracé à un fichier pdf existant

Je veux ajouter un tracé à un pdf existant longtemps après que dev.off() a été appelé*. Après avoir lu le fichier d'aide pdf() et après avoir lu les questions-réponses ici et ici , je suis sûr que cela ne peut pas être fait en R. mais, peut-être que certains d'entre vous ont une solution que je n'ai pas pu trouver.

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()

*ce n'est pas une copie des questions liées ci-dessus parce que je veux ajouter à un fichier pdf après le périphérique pdf a été fermé.

28
demandé sur Community 2012-11-07 20:10:04

5 réponses

Vous pouvez utiliser recordPlot pour stocker chaque parcelle de terrain dans une list, puis les écrire dans un fichier pdf à la fin avec replayPlot. Voici un exemple:

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()
19
répondu Matthew Plourde 2012-11-07 16:46:28

Si vous êtes prêt à installer le petit, gratuit, indépendant de la plate-formepdftk utilitaire, vous pouvez utiliser un appel système de R pour le faire assembler toutes vos figures:

## 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"
17
répondu Josh O'Brien 2012-11-07 18:02:44

Ceci est horriblement hacky et dément probablement mon shell UNIX limité fu, mais cela fonctionne pour moi sur une boîte Fedora 17 avec le pdfjam package installé (Pas un package R, mais à partir des repos 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()

La sortie en R est:

> 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

Fondamentalement, pdfjoin prendra l'entrée de stdin si c'est le seul fichier d'entrée, donc je dirige la sortie de pdf() vers le programme pdfjoin et spécifie le fichier de sortie en utilisant l'argument --outfile. Ensuite, en utilisant && est rejoindre l'original pdf1.pdf avec le pdf2.pdf juste créé, en spécifiant que le PDF de sortie est pdf1.pdf, le nom du PDF d'origine.

6
répondu Gavin Simpson 2012-11-07 16:46:20

J'ai trouvé cet excellent travail récemment (ne pas essayer de le revendiquer comme le mien)

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

Ce n'est pas tout à fait ce que l'OP demandait, mais la raison pour laquelle je l'aime est que j'ai souvent des scatterplots assez denses et d'autres parcelles qui ne répondent pas particulièrement bien au redimensionnement de la fenêtre, etc. dans un document pdf. Cependant, j'ai besoin de produire une sortie de plusieurs pages. Donc, si les parcelles sont denses en données, je les rends comme .png et puis utilisez la fonction ci-dessus pour recombiner à la fin.

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)
  }

}
0
répondu Pascoe 2017-07-25 16:58:40
pdf("myFile.pdf",onefile=T)

plot(1:10,10:1) #First plot (page 1)
plot(1:10,rep(5,10)) #Want this one on page 2

dev.off()
-2
répondu MCH 2016-10-27 15:59:51