保存对象中的情节

ggplot2中,可以很容易地将图形保存到 R 对象中。

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

标准函数 plot将图形作为 void 函数生成,并返回 NULL。

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

是否可以将 plot创建的图形保存在对象中?

69998 次浏览

base graphics draw directly on a device.

You could use

1- recordPlot

2- the recently introduced gridGraphics package, to convert base graphics to their grid equivalent

Here's a minimal example,

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)

You can use the active binding feature of the pryr package if you don't want to directly change the values of the object created.

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

Each time you type a on the console the graph will be reprinted on the screen. The %<a-% operator will rerun the script every time (in case of one graph this is not a problem I think). So essentially every time you use a the code will be rerun resulting in your graph which of course you can manipulate (overlay another plot on top) or save using png for example. No value itself will be stored in a however. The value will still be NULL.

I don't know if the above is what you are looking for but it might be an acceptable solution.

I am very late to this, but it was the first question which showed up when I searched for the question. So I'd like to add my solution for future viewers who come across the question.

I solved this by using a function instead of an object. For example, suppose we want to compare two beta distributions with different parameters. We can run:

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

And save the plots as functions rather than objects.

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

Next, we can call each plot as we want by simply calling the two plots as functions rather than objects.

z.plot1()

plots the first plot and

z.plot2()

plots the second.

Hope that helps someone who stumbles across this later!

library(ggplot2)
# if mygraph is a plot object
ggsave("myplot1.png",mygraph)


# if the plot is in a list (e.g. created by the Bibliometrics package)
ggsave("myplot1.png",mygraphs[[1]])