web-dev-qa-db-fra.com

Enregistrer un tracé dans un objet

Dans ggplot2, on peut facilement enregistrer un graphique dans un objet R.

p = ggplot(...) + geom_point()      # does not display the graph
p                                   # displays the graph

La fonction standard plot génère le graphique en tant que fonction vide et renvoie NULL.

p = plot(1:10)     # displays the graph
p                  # NULL

Est-il possible de sauvegarder un graphique créé par plot dans un objet?

65
Remi.b

les graphiques de base sont dessinés directement sur un périphérique.

Vous pourriez utiliser

1- recordPlot

2- le récent gridGraphics package , pour convertir les graphiques de base en leur équivalent en grille

Voici un exemple minimal,

plot(1:10) 

p <- recordPlot()
plot.new() ## clean up device
p # redraw

## grab the scene as a grid object
library(gridGraphics)
library(grid)
grid.echo()
a <- grid.grab()

## draw it, changes optional
grid.newpage()
a <- editGrob(a, vp=viewport(width=unit(2,"in")), gp=gpar(fontsize=10))
grid.draw(a)
77
baptiste

Je suis très en retard sur ce point, mais c’est la première question qui a été posée lorsque j’ai cherché la question. Je voudrais donc ajouter ma solution pour les futurs téléspectateurs qui rencontrent la question.

J'ai résolu ce problème en utilisant une fonction au lieu d'un objet. Par exemple, supposons que nous voulions comparer deux distributions bêta avec des paramètres différents. Nous pouvons courir:

z1<-rbeta(10000,5,5)
z2<-rbeta(10000,20,20)
plotit<-function(vector,alpha,beta){
plot(density(vector),xlim=c(0,1))
abline(v=alpha/(alpha+beta),lty="longdash")
}

Et enregistrez les tracés en tant que fonctions plutôt que des objets.

z.plot1<-function(){plotit(z1,5,5)}
z.plot2<-function(){plotit(z2,20,20)}

Ensuite, nous pouvons appeler chaque parcelle comme bon nous semble en appelant simplement les deux graphes comme des fonctions plutôt que comme des objets.

z.plot1()

parcelle la première parcelle et

z.plot2()

parcelle la seconde.

J'espère que cela aidera quelqu'un qui trouve cela plus tard!

16
cartwheel

Vous pouvez utiliser la fonctionnalité de liaison active du package pryr si vous ne souhaitez pas modifier directement les valeurs de l'objet créé.

library(pryr)
a %<a-% plot(1:10,1:10)

Chaque fois que vous tapez a sur la console, le graphique sera réimprimé à l'écran. Le %<a-% _ l'opérateur relancera le script à chaque fois (dans le cas d'un graphique, ce n'est pas un problème, je pense). Ainsi, chaque fois que vous utiliserez a, le code sera réexécuté, ce qui donnera à votre graphique la possibilité de le manipuler (superposer un autre tracé au-dessus) ou d’enregistrer en utilisant, par exemple, png. Aucune valeur elle-même ne sera stockée dans a cependant. La valeur sera toujours NULL.

Je ne sais pas si vous recherchez la solution ci-dessus, mais cela pourrait être une solution acceptable.

15
LyzandeR