将绘图保存在对象中

问题描述 投票:0回答:3

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

r plot
3个回答
121
投票

基础图形直接在设备上绘制。

你可以使用

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)

56
投票

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

绘制第二个。


20
投票

如果您不想直接更改创建的对象的值,可以使用

pryr
包的活动绑定功能。

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

每次您在控制台上键入

a
时,图表都会重新打印在屏幕上。
%<a-%
运算符每次都会重新运行脚本(对于一张图,我认为这不是问题)。因此,基本上每次您使用
a
时,代码都会重新运行,从而生成您的图表,当然您可以操作该图表(在顶部覆盖另一个图)或使用
png
进行保存。然而,值本身不会存储在
a
中。该值仍将为 NULL。

我不知道上面的内容是否是您正在寻找的,但这可能是一个可以接受的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.