在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
创建的图形保存在对象中?
答案 0 :(得分:71)
基本图形直接在设备上绘制。
您可以使用
1- recordPlot
2-最近推出的gridGraphics
package,将基本图形转换为等效网格
这是一个最小的例子,
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)
答案 1 :(得分:14)
如果您不想直接更改所创建对象的值,则可以使用pryr
包的有效绑定功能。
library(pryr)
a %<a-% plot(1:10,1:10)
每次在控制台上键入a
时,图形都将在屏幕上重新打印。 %<a-%
运算符每次都会重新运行脚本(如果是一个图表,我认为这不是问题)。因此,基本上每次使用a
时,代码都会重新运行,从而导致您的图形当然可以操作(在顶部覆盖另一个图形)或使用png
保存。但是,a
中不会存储任何值本身。该值仍为NULL。
我不知道上述内容是否符合您的要求,但这可能是一种可接受的解决方案。
答案 2 :(得分:14)
我对此很晚,但这是我在搜索问题时出现的第一个问题。所以我想为遇到问题的未来观众添加我的解决方案。
我通过使用函数而不是对象解决了这个问题。例如,假设我们想要比较具有不同参数的两个beta分布。我们可以运行:
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")
}
将图表保存为函数而不是对象。
z.plot1<-function(){plotit(z1,5,5)}
z.plot2<-function(){plotit(z2,20,20)}
接下来,我们可以通过简单地将两个图调用为函数而不是对象来调用每个图。
z.plot1()
绘制第一个图和
z.plot2()
绘制第二个。
希望能帮助后来遇到这种情况的人!
答案 3 :(得分:1)
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]])