Salvar um gráfico em um object

No ggplot2 , pode-se facilmente salvar um gráfico em um object R.

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

O plot function padrão produz o gráfico como uma function vazia e retorna NULL.

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

É possível salvar um gráfico criado por plot em um object?

charts base desenhar diretamente em um dispositivo.

Você poderia usar

1- recordPlot

2- o recém-lançado pacote gridGraphics , para converter charts de base em seu equivalente de grade

Aqui está um exemplo mínimo,

 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) 

Você pode usar o recurso de binding ativa do pacote pryr se não quiser alterar diretamente os valores do object criado.

 library(pryr) a % 

Cada vez que você digitar a no console, o gráfico será reimpresso na canvas. O operador % executará novamente o script toda vez (no caso de um gráfico, isso não é um problema). Então, essencialmente, toda vez que você usar a código, ele será reexecutado, resultando em seu gráfico, o que obviamente você pode manipular (sobrepor outro gráfico no topo) ou salvar usando png por exemplo. Nenhum valor em si será armazenado em a no entanto. O valor ainda será NULL.

Eu não sei se o acima é o que você está procurando, mas pode ser uma solução aceitável.

Estou muito atrasado para isso, mas foi a primeira pergunta que apareceu quando pesquisei a questão. Então, gostaria de adicionar minha solução para os futuros espectadores que se depararem com a pergunta.

Eu resolvi isso usando uma function em vez de um object. Por exemplo, suponha que queremos comparar duas distribuições beta com parâmetros diferentes. Nós podemos correr:

 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 salve os charts como funções em vez de objects.

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

Em seguida, podemos chamar cada gráfico como quisermos, simplesmente chamando os dois charts como funções, e não como objects.

 z.plot1() 

traça o primeiro lote e

 z.plot2() 

traça o segundo.

Espero que ajude alguém que se depara com isso mais tarde!