2015-04-11 16 views
42

In ggplot2, si può facilmente salvare un grafico in un oggetto R.Salva un grafico in un oggetto

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

La funzione standard plot produce il grafico come funzione vuoto e restituisce NULL.

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

E 'possibile salvare un grafico creato da plot in un oggetto?

+0

'plot' è un generico e diversi metodi' plot' restituiscono tali oggetti per quanto ne so. 'plot.default', tuttavia, restituisce' NULL'. –

+0

Il tuo obiettivo è riuscire a sostituire il tuo grafico solo digitando 'p' dopo averlo salvato come oggetto? O ti piacerebbe salvarlo come un oggetto che poi potresti modificare i suoi valori, ad esempio? – LyzandeR

+0

Potrei voler sovrapporre altri grafici sopra l'immagine salvata, ma non ho lo scopo di modificare la trama che è stata creata e salvata. Ho risposto alla tua domanda? Ths –

risposta

49

grafica di base disegnata direttamente su un dispositivo.

Si potrebbe utilizzare

1- recordPlot

2- il recentemente introdotto gridGraphics package, per convertire la grafica di base per la loro griglia equivalente

Ecco un esempio minimo,

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) 
+0

Non è chiaro per me: sono (1) e (2) metodi separati per raggiungere lo stesso obiettivo, o due passaggi entrambi necessari per rispondere alla domanda dell'OP? – NLi10Me

+0

@ NLi10Me 2 metodi diversi. – zx8754

11

È può utilizzare la funzione di rilegatura attiva del pacchetto pryr se non si desidera cambia i valori dell'oggetto creato.

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

Ogni volta che si digita a sulla console del grafico verrà ristampato sullo schermo. L'operatore %<a-% eseguirà nuovamente lo script ogni volta (in caso di un grafico questo non è un problema, penso). Quindi, in pratica ogni volta che usi a il codice verrà rieseguito con conseguente grafico che, ovviamente, puoi manipolare (sovrapporre un altro grafico in alto) o salvare usando png per esempio. Nessun valore stesso verrà memorizzato in a tuttavia. Il valore sarà ancora NULL.

Non so se quanto sopra è quello che stai cercando, ma potrebbe essere una soluzione accettabile.

+0

Grazie. Questa è una soluzione molto utile. Sai se questo funziona se la trama è costruita attraverso più righe (come 'trama (1:10); abline (v = 4)' per esempio)? +1 –

+0

@ Remi.b Sì, certo che sì. Devi scriverlo in questo modo "" a% LyzandeR

+0

Questo è davvero interessante! Dovrò leggere un po 'di questo pacchetto perché mi sembra impossibile fare ciò che questa strana funzione '%

4

Sono molto in ritardo a questo, ma è stata la prima domanda che si è presentata quando ho cercato la domanda. Quindi vorrei aggiungere la mia soluzione per i futuri spettatori che si imbattono nella domanda.

Ho risolto questo problema utilizzando una funzione anziché un oggetto. Ad esempio, supponiamo di voler confrontare due distribuzioni beta con parametri diversi. Siamo in grado di eseguire:

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") 
} 

e salvare le trame come funzioni piuttosto che oggetti.

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

Successivamente, possiamo chiamare ogni trama come vogliamo semplicemente chiamando i due grafici come funzioni anziché come oggetti.

z.plot1() 

traccia la prima scena e

z.plot2() 

trame del secondo.

La speranza che aiuta qualcuno che si imbatte in questo più tardi!