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é.
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()
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"
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.
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)
}
}
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()