在
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
创建的图形保存在对象中?
基础图形直接在设备上绘制。
你可以使用
1-
recordPlot
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)
我通过使用函数而不是对象解决了这个问题。例如,假设我们想要比较具有不同参数的两个 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()
绘制第二个。
如果您不想直接更改创建的对象的值,可以使用
pryr
包的活动绑定功能。
library(pryr)
a %<a-% plot(1:10,1:10)
每次您在控制台上键入
a
时,图表都会重新打印在屏幕上。 %<a-%
运算符每次都会重新运行脚本(对于一张图,我认为这不是问题)。因此,基本上每次您使用 a
时,代码都会重新运行,从而生成您的图表,当然您可以操作该图表(在顶部覆盖另一个图)或使用 png
进行保存。然而,值本身不会存储在 a
中。该值仍将为 NULL。
我不知道上面的内容是否是您正在寻找的,但这可能是一个可以接受的解决方案。