web-dev-qa-db-fra.com

Comment enregistrer un tracé en tant qu'image sur le disque?

Je trace une régression linéaire simple à l'aide de R. Je souhaite enregistrer cette image au format PNG ou JPEG. Est-il possible de le faire automatiquement? (via code)

Il y a deux questions différentes: premièrement, je regarde déjà l'intrigue sur mon moniteur et je voudrais l'enregistrer tel quel. Deuxièmement, je n'ai pas encore généré l'intrigue, mais j'aimerais l'enregistrer directement sur le disque lorsque j'exécute mon code de traçage.

293
blakc05

Il y a deux questions étroitement liées et une réponse pour chacune.


1. Une image sera générée à l'avenir dans mon script. Comment puis-je l'enregistrer sur le disque?

Pour enregistrer un tracé, vous devez procéder comme suit:

  1. Ouvrez un périphérique à l’aide de png(), bmp(), pdf() ou similaire.
  2. Tracer votre modèle
  3. Fermez l'appareil avec dev.off()

Un exemple de code pour enregistrer le tracé dans un fichier png:

_fit <- lm(some ~ model)

png(filename="your/file/location/name.png")
plot(fit)
dev.off()
_

Ceci est décrit dans la page d'aide (combinée) pour les formats graphiques _?png_, _?bmp_, _?jpeg_ et _?tiff_ ainsi que dans la page d'aide distincte pour _?pdf_.

Notez toutefois que l'image sur le disque peut paraître différente du même tracé directement tracé à votre écran, par exemple si vous avez redimensionné la fenêtre à l'écran.


Notez que si votre tracé est créé avec lattice ou _ggplot2_, vous devez l’imprimer explicitement. Voir cette réponse qui explique cela plus en détail et qui contient également des liens vers la FAQ R: qplot de ggplot ne s’exécute pas à la source


2. Je suis en train de regarder un tracé sur mon écran et je veux le copier tel quel sur le disque.

_dev.print(pdf, 'filename.pdf')
_

Cela devrait parfaitement copier l'image, en respectant le redimensionnement que vous avez effectué dans la fenêtre interactive. Vous pouvez, comme dans la première partie de cette réponse, remplacer pdf par d'autres types de fichiers tels que png.

364
Andrie

Si vous voulez continuer à voir le tracé en R, une autre option consiste à utiliser dev.copy:

X11 ()
plot (x,y)

dev.copy(jpeg,filename="plot.jpg");
dev.off ();

Si vous rencontrez trop de fenêtres de tracé dans R, utilisez graphics.off() pour fermer toutes les fenêtres de tracé.

79
Itamar

Si vous utilisez ggplot2, la méthode de sauvegarde préférée consiste à utiliser ggsave. Vous devez d’abord tracer, après avoir créé le tracé, vous appelez ggsave:

ggplot(...)
ggsave("plot.png")

Le format de l'image est déterminé par l'extension que vous choisissez pour le nom de fichier. Des paramètres supplémentaires peuvent être passés à ggsave, notamment width, height et dpi.

65
Paul Hiemstra

Comme ça

png('filename.png')
# make plot
dev.off()

ou ca

# sometimes plots do better in vector graphics
svg('filename.svg')
# make plot
dev.off()

ou ca

pdf('filename.pdf')
# make plot
dev.off()

Et probablement d'autres aussi. Ils sont tous énumérés ensemble dans les pages d'aide.

29
Owen

Pour la première question, je trouve que dev.print est le meilleur lorsque vous travaillez de manière interactive. Tout d’abord, vous configurez votre tracé visuellement et lorsque vous êtes satisfait de ce que vous voyez, vous pouvez demander à R de sauvegarder le tracé actuel sur le disque.

dev.print(pdf, file="filename.pdf");

Vous pouvez remplacer pdf par d'autres formats tels que png.

Cela copie l'image exactement telle que vous la voyez à l'écran. Le problème avec dev.copy est que l'image est souvent différente et ne se souvient pas de la taille de la fenêtre ni du rapport de format - elle oblige le tracé à être carré par défaut.

Pour la deuxième question, (comme d’autres ont déjà répondu), vous devez diriger la sortie sur le disque avant d’exécuter vos commandes de traçage.

pdf('filename.pdf')
plot( yourdata )
points (some_more_data)
dev.off() # to complete the writing process and return output to your monitor
11
Aaron McDaid

Si vous utilisez R Studio http://rstudio.org/ , un menu spécial vous permet d'enregistrer votre tracé dans le format de votre choix et à la résolution de votre choix.

8
efstratios charitos

Si vous ouvrez un appareil en utilisant png(), bmp(), pdf() etc. comme suggéré par Andrie (la meilleure réponse), les fenêtres avec des tracés ne s'ouvriront pas, seuls les fichiers * .png, * bmp ou * .pdf seront créés. Ceci est pratique dans les calculs massifs, car R ne peut gérer qu'un nombre limité de fenêtres graphiques.

Toutefois, si vous souhaitez voir les tracés et les enregistrer, appelez savePlot(filename, type) une fois que les tracés ont été dessinés et que la fenêtre qui les contient est active.

3
Alex Fainshtein
plotpath<- file.path(path, "PLOT_name",paste("plot_",file,".png",sep=""))

png(filename=plotpath)

plot(x,y, main= file)

dev.off()
2
Gijs

Dans certains cas, on souhaite à la fois enregistrer et imprimer un tracé de base. J'ai passé un peu de temps et suis venu avec cette fonction utilitaire:

x = 1:10

basesave = function(expr, filename, print=T) {
  #extension
  exten = stringr::str_match(filename, "\\.(\\w+)$")[, 2]

  switch(exten,
         png = {
           png(filename)
           eval(expr, envir = parent.frame())
           dev.off()
         },
         {stop("filetype not recognized")})


  #print?
  if (print) eval(expr, envir = parent.frame())

  invisible(NULL)
}

#plots, but doesn't save
plot(x)

#saves, but doesn't plot
png("test.png")
plot(x)
dev.off()

#both
basesave(quote(plot(x)), "test.png")

#works with pipe too
quote(plot(x)) %>% basesave("test.png")

Notez que vous devez utiliser quote, sinon l'appel plot(x) est exécuté dans l'environnement global et NULL est transmis à basesave().

0
Deleet

Pour ajouter à ces réponses, si vous avez un script R contenant des appels générant des tracés à l'écran (le périphérique natif), vous pouvez alors tous les enregistrer dans un fichier pdf (le périphérique par défaut pour un shell non interactif) "Rplots.pdf "(le nom par défaut) en redirigeant le script vers R depuis le terminal (en supposant que vous utilisez Linux ou OS X), par exemple:

R < myscript.R --no-save

Cela pourrait être converti en jpg/png si nécessaire

0
waferthin
dev.copy(png,'path/pngFile.png')
plot(YData ~ XData, data = mydata)
dev.off()
0
orientchen1978