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


304

Je trace une régression linéaire simple à l'aide de R. Je voudrais 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é le tracé, mais je voudrais l'enregistrer directement sur le disque lorsque j'exécute mon code de tracé.


Peut-être que cette question devrait être modifiée pour poser deux scénarios distincts: Premièrement, vous pourriez travailler de manière interactive et avoir créé un joli graphique que vous souhaitez enregistrer. Ou, deuxièmement, vous n'avez pas encore vu de tracé et vous voulez l'écrire directement sur le disque sans le regarder d'abord - cela aurait du sens si vous écriviez un script pour générer de nombreux tracés pour vous. Je vais le modifier maintenant
Aaron McDaid

Réponses:


376

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 l'enregistrer sur le disque?

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

  1. Ouvrez un dispositif, en utilisant png(), bmp(), pdf()ou similaire
  2. Tracez votre modèle
  3. Fermez l'appareil à l'aide de dev.off()

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

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, ?jpeget ?tiffainsi que dans la page d'aide séparée pour ?pdf.

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


Notez que si votre tracé est créé par l'un latticeou l' autre, ggplot2vous devez imprimer explicitement le tracé. Voir cette réponse qui explique cela plus en détail et également des liens vers la FAQ R: qplot de ggplot ne s'exécute pas lors du sourcing


2. Je regarde actuellement 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 tout redimensionnement que vous avez fait à la fenêtre interactive. Vous pouvez, comme dans la première partie de cette réponse, remplacer pdfpar d'autres types de fichiers tels que png.


4
si vous ne définissez pas le chemin, comme png (filename = "name.png"), vous pouvez connaître le répertoire de sauvegarde avecgetwd()
JuanPablo

2
J'ai étendu cette réponse pour inclure une référence à dev.print. Il y a deux questions étroitement liées qui, à mon avis, nécessitent des réponses différentes. La deuxième sous-question est essentiellement "Comment puis-je enregistrer une image que j'ai déjà tracée sur mon écran?". Toutes mes excuses si ma modification n'est pas très bonne, n'hésitez pas à améliorer mes modifications.
Aaron McDaid

Comment dois-je procéder lorsque R demande une "sélection"? Par exemple, si j'utilise m3=garchFit(~arma(3,0)+garch(1,1))et plot(m3).
jacob

3
Comment puis-je enregistrer le chiffre avec dpi = 3000
Abhishek

2
8 ans en utilisant R sans savoir que je pouvais réellement enregistrer le dev ouvert sur mon écran dans un fichier. Je suppose que je n'avais pas besoin de ça ... mais merci beaucoup: D
Simon C.

82

Si vous voulez continuer à voir l'intrigue dans R, une autre option est d'utiliser dev.copy:

X11 ()
plot (x,y)

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

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


2
Très bonne réponse! Cela vous permet d'expérimenter des tracés via X, jusqu'à ce que vous soyez satisfait des résultats, puis de les enregistrer sur place. Il s'agit généralement du mode de fonctionnement le plus pratique.
Aaron McDaid

3
dev.printest mieux car il copie exactement l'image de l'écran. dev.copyforce chaque image à être carrée par défaut. C'est frustrant si vous avez tout configuré de manière interactive
Aaron McDaid

4
J'utilise dev.print()avec les paramètres largeur et hauteur pour définir les dimensions. par exemple dev.copy(device = png, filename = 'MyPlot.png', width = 1000, height = 500) dev.off()
Scott

72

Si vous utilisez ggplot2la méthode d'enregistrement préférée, utilisez ggsave. Vous devez d'abord tracer, après avoir créé le tracé que 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. Peuvent être transmis à d' autres paramètres ggsave, notamment width, heightet dpi.


Cela fonctionne bien dans une boucle, dev.off ne fonctionne pas pour moi
princelySid

L'avantage de cela est l'API cohérente et pas besoin de jouer avec les appareils sous et hors tension
qwr

Contrairement aux solutions avec dev, cette solution fonctionnait sur une machine virtuelle sans périphériques graphiques.
miguelmorin

Je souhaite qu'il y ait une approche puissante, mais simple, comme celle-ci pour TOUTES les parcelles dans R. Quoi qu'il en soit, mon vote va ici.
SilSur

1
Toujours valable près de 7 ans! Je vous remercie.
Nick

30

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 répertoriés ensemble dans les pages d'aide.


Existe-t-il un moyen pour R d'inférer automatiquement l'extension de fichier (c'est-à-dire en fonction de la fonction)? Il semble fastidieux de devoir changer le nom du fichier ainsi que la fonction utilisée.
Bonlenfum

11

Pour la première question, je trouve dev.printêtre le meilleur lorsque je travaille 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 d'enregistrer le tracé actuel sur le disque

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

Vous pouvez remplacer pdfpar d'autres formats tels que png.

Cela copiera l'image exactement comme vous la voyez à l'écran. Le problème dev.copyest que l'image est souvent différente et ne se souvient pas de la taille de la fenêtre et du rapport hauteur / largeur - elle force le tracé à être carré par défaut.

Pour la deuxième question, (comme d'autres l'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

8

Si vous utilisez R Studio http://rstudio.org/ il y a un menu spécial pour enregistrer votre tracé sous n'importe quel format que vous aimez et à n'importe quelle résolution que vous choisissez


4
Cela existe également dans l'interface graphique R sur Windows, au moins.
richiemorrisroe du

parfois cela échoue mystérieusement pour moi, mais appeler une fonction fonctionne toujours
qwr

3

Si vous ouvrez un appareil à l' aide png(), bmp(), pdf()etc. comme suggéré par Andrie (la meilleure réponse), les fenêtres avec des parcelles ne seront pas pop - up ouvert, juste * .png, * .bmp ou * fichiers .pdf seront créés. C'est pratique dans les calculs massifs, car R ne peut gérer qu'un nombre limité de fenêtres graphiques.

Cependant, si vous souhaitez voir les tracés et les enregistrer, appelez une savePlot(filename, type)fois les tracés dessinés et la fenêtre les contenant active.



0

Pour ajouter à ces réponses, si vous avez un script R contenant des appels qui génèrent des tracés à filtrer (le périphérique natif), ceux-ci peuvent tous être enregistrés 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

Dans certains cas, on veut à la fois enregistrer et imprimer un tracé de base r. J'ai passé un peu de temps et j'ai trouvé 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 l'on doit utiliser quote, sinon l' plot(x)appel est exécuté dans l'environnement global et NULLest passé à basesave().


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.