Comment sauvegarder un graphique en tant qu'image sur le disque?

je trace une régression linéaire simple en utilisant R. Je voudrais enregistrer cette image en PNG ou JPEG, est-il possible de le faire automatiquement? (code via)

il y a deux questions différentes: D'abord, je suis déjà en train de regarder l'intrigue sur mon moniteur et je voudrais la sauver telle quelle. Deuxièmement, je n'ai pas encore généré le tracé, mais je voudrais le sauvegarder directement sur le disque lorsque j'exécute mon code de pointage.

257
demandé sur Aaron McDaid 2011-08-22 11:06:34

11 réponses

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

pour sauvegarder une parcelle, vous devez faire ce qui suit:

  1. ouvrir un dispositif, en utilisant png() , bmp() , pdf() ou similaire
  2. track your model
  3. fermer le dispositif utilisant dev.off()

un exemple de code pour sauvegarder la parcelle 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 séparée pour ?pdf .

notez cependant que l'image peut sembler différente sur le disque à la même parcelle directement tracée à votre l'écran, par exemple si vous avez redimensionné la fenêtre à l'écran.


notez que si votre parcelle est faite par lattice ou ggplot2 vous devez imprimer explicitement la parcelle. Voir cette réponse qui explique cela plus en détail et aussi des liens vers la FAQ R: qplot de ggplot n'exécute pas sur le sourcing


2. Je suis actuellement en train de regarder un complot sur mon écran et je pour le copier, de "tel quel" sur le disque.

dev.print(pdf, 'filename.pdf')

cela devrait copier l'image parfaitement, 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 pdf par d'autres types de fichiers tels que png .

326
répondu Andrie 2017-05-23 11:54:43

si vous voulez continuer à voir la parcelle en 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 fouillis de trop de fenêtres de parcelle dans R, Utilisez graphics.off() pour fermer toutes les fenêtres de parcelle.

72
répondu Itamar 2011-09-01 10:31:55

si vous utilisez ggplot2 le moyen préféré d'économiser est d'utiliser ggsave . Tout d'abord, vous devez tracer, après la création de la parcelle 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 du fichier. Des paramètres supplémentaires peuvent être passés à ggsave , notamment width , height , et dpi .

52
répondu Paul Hiemstra 2012-11-17 08:53:19

comme ceci

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

ou ce

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

ou ce

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

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

26
répondu Owen 2011-08-22 07:11:15

pour la première question, je trouve que dev.print est le meilleur quand on travaille de façon interactive. Tout d'abord, vous configurez votre parcelle visuellement et lorsque vous êtes satisfait de ce que vous voyez, vous pouvez demander à R de sauvegarder la parcelle actuelle sur le disque

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

vous pouvez remplacer pdf par png .

cela copiera l'image exactement comme vous la voyez à l'écran. Le problème avec dev.copy , c'est que l'image est souvent différente et ne se souvient pas de la taille de la fenêtre et le rapport d'aspect - il force 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 pointage

pdf('filename.pdf')
plot( yourdata )
points (some_more_data)
dev.off() # to complete the writing process and return output to your monitor
11
répondu Aaron McDaid 2015-01-14 18:46:22

si vous utilisez R Studio http://rstudio.org/ il y a un menu spécial pour vous sauver tracer comme n'importe quel format que vous aimez et à n'importe quelle résolution vous choisissez

8
répondu efstratios charitos 2011-08-22 11:22:38

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 parcelles ne pop up ouvert, juste *.png, *bmp ou *.les fichiers pdf seront créés. Cela est pratique dans les calculs massifs, puisque R ne peut gérer qu'un nombre limité de fenêtres graphiques.

cependant, si vous voulez voir les parcelles et les faire sauvegarder, appelez savePlot(filename, type) après les parcelles sont tirés et la fenêtre contenant est active.

2
répondu Alex Fainshtein 2015-03-10 07:08:37
plotpath<- file.path(path, "PLOT_name",paste("plot_",file,".png",sep=""))

png(filename=plotpath)

plot(x,y, main= file)

dev.off()
2
répondu Gijs 2015-12-23 14:02:24

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

cette valeur peut être convertie en jpg/png si nécessaire

0
répondu wannymahoots 2015-06-10 11:39:45

dans certains cas, on veut à la fois sauvegarder 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 qu'il faut utiliser quote , sinon l'appel plot(x) est lancé dans l'environnement global et NULL passe à basesave() .

0
répondu Deleet 2017-01-13 21:24:45
dev.copy(png,'path/pngFile.png')
plot(YData ~ XData, data = mydata)
dev.off()
0
répondu orientchen1978 2017-03-17 03:55:41