将图存储在对象中

Rem*_*i.b 71 plot r

ggplot2,可以轻松地将图形保存到R对象中.

p = ggplot(...) + geom_point()      # does not display the graph
p                                   # displays the graph
Run Code Online (Sandbox Code Playgroud)

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

p = plot(1:10)     # displays the graph
p                  # NULL
Run Code Online (Sandbox Code Playgroud)

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

bap*_*ste 80

基本图形直接在设备上绘制.

你可以用

1- recordPlot

2-最近推出的gridGraphics,将基本图形转换为它们的网格等价物

这是一个最小的例子,

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)
Run Code Online (Sandbox Code Playgroud)


小智 18

我迟到了,但这是我搜索问题时出现的第一个问题.所以我想为遇到问题的未来观众添加我的解决方案.

我通过使用函数而不是对象解决了这个问题.例如,假设我们想要比较具有不同参数的两个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")
}
Run Code Online (Sandbox Code Playgroud)

并将图表保存为函数而不是对象.

z.plot1<-function(){plotit(z1,5,5)}
z.plot2<-function(){plotit(z2,20,20)}
Run Code Online (Sandbox Code Playgroud)

接下来,我们可以通过简单地将两个图调用为函数而不是对象来调用每个图.

z.plot1()
Run Code Online (Sandbox Code Playgroud)

绘制第一个图和

z.plot2()
Run Code Online (Sandbox Code Playgroud)

绘制第二个.

希望能帮助后来遇到这种情况的人!


Lyz*_*deR 15

pryr如果您不想直接更改创建的对象的值,则可以使用程序包的活动绑定功能.

library(pryr)
a %<a-% plot(1:10,1:10)
Run Code Online (Sandbox Code Playgroud)

每次a在控制台上键入时,图形都将在屏幕上重新打印.该%<a-%运营商将每一次(在一个图的情况下,这是没有问题的,我认为)重新运行该脚本.因此,基本上每次使用a代码时都会重新运行,从而产生您的图形,当然您可以操作(在顶部覆盖另一个图形)或使用png例如保存.但是,没有值存储在其中a.该值仍为NULL.

我不知道上面是否是您正在寻找的,但它可能是一个可接受的解决方案.