Salva un grafico in un object

In ggplot2 , è ansible salvare facilmente un’immagine in un object R.

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

Il grafico di funzione standard produce l’immagine come una funzione di vuoto e restituisce NULL.

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

È ansible salvare un grafico creato dalla plot in un object?

la grafica di base si disegna direttamente su un dispositivo.

Potresti usare

1- recordPlot

2- il pacchetto gridGraphics introdotto di recente, per convertire la grafica di base in equivalente griglia

Ecco un esempio minimale,

 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) 

È ansible utilizzare la funzione di rilegatura triggers del pacchetto pryr se non si desidera modificare direttamente i valori dell’object creato.

 library(pryr) a % 

Ogni volta che si digita a sulla console, il grafico verrà ristampato sullo schermo. L'operatore % ricomincerà lo script ogni volta (nel caso di un grafico questo non è un problema, penso). Quindi, in sostanza, ogni volta che si utilizza il codice verrà rieseguito con conseguente grafico che, ovviamente, è ansible manipolare (sovrapporre un altro grafico in alto) o salvare utilizzando png ad esempio. Tuttavia, nessun valore verrà memorizzato. Il valore sarà ancora NULL.

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

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 object. Ad esempio, supponiamo di voler confrontare due distribuzioni beta con parametri diversi. Possiamo 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 salva le trame come funzioni piuttosto che come 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() 

trama la prima trama e

 z.plot2() 

trama il secondo.

Spero che aiuti qualcuno che si imbatte in questo dopo!