R语言 在对象中保存打印

vbopmzt1  于 2023-05-11  发布在  其他
关注(0)|答案(4)|浏览(147)

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创建的图形保存在对象中?

ikfrs5lh

ikfrs5lh1#

基本图形直接在设备上绘制。
你可以用
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)
nwlls2ji

nwlls2ji2#

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

绘制第二个。

f3temu5u

f3temu5u3#

如果您不想直接更改所创建对象的值,可以使用pryr包的活动绑定特性。

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

每次您在控制台上键入a,图形将重新打印在屏幕上。%<a-%操作符每次都会重新运行脚本(对于一个图,我认为这不是问题)。因此,基本上每次使用a时,代码都会重新运行,从而生成您的图形,当然您可以操作(在顶部覆盖另一个图)或使用png保存。但是,值本身不会存储在a中。该值仍为NULL。
我不知道上面的是不是你正在寻找的,但它可能是一个可以接受的解决方案。

pbgvytdp

pbgvytdp4#

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]])

相关问题