5

我不确定如何将其放入 OO-Speech 中。但是,当您创建 ggplot 时,它将依赖于源 data.frame。那么如何在没有这种依赖的情况下保存 ggplot 呢?

dat <- data.frame(x=runif(10),y=runif(10))  
g <- ggplot(dat, aes(x,y)) + geom_point()  
g  

dat <- NULL  
g

第二个 $g$ 不会产生绘图,因此 dat 是 $NULL$。如何保存 $g$ 以便可以更改 dat?

我知道这不是一个好习惯,但我得到了一些我不想摆弄的很长的代码。

4

2 回答 2

5

就个人而言,我认为@Joshua 的答案太复杂了(如果我理解你想要做什么)。

我认为更改存储在绘图对象中的数据框没有任何意义,因为ggplot2有一个特殊的中缀运算符,专门设计用于将新数据框应用于给定的绘图对象:%+%.

dat <- data.frame(x=runif(10),y=runif(10))  
g <- ggplot(dat, aes(x,y)) + geom_point()  
g

在此处输入图像描述

#Change the data frame
dat$y <- rexp(10)
#Replot g using the altered data frame
g %+% dat

在此处输入图像描述

当然,这不仅适用于原始数据框的更改版本,还适用于全新的数据框,前提是它包含所有必需的变量(并且它们的名称相同)。

于 2012-07-12T14:23:32.953 回答
3

我认为有几种选择,我按我的喜好顺序显示。

## setup
require(ggplot2)
set.seed(10) # make reproducible
dat <- data.frame(x=1:10,y=runif(10))   

我最喜欢的选择是为您的代码创建一个简单的函数包装器。然后,每当您需要更改数据时,只需将新数据传递给您的函数,它就会将其提供给ggplot并创建新图形。这是灵活的并且对问题相当健壮。它也是可扩展的,因为如果以后您决定也希望能够更改标题,您也可以在函数中添加一个标题参数。

## my favorite option
myplot <- function(data) {
  ggplot(data, aes(x, y)) + geom_point()
}

## use it
myplot(data = dat)

第一个情节

## change it
dat <- data.frame(x = 11:20, y = runif(10))
myplot(data = dat)

第二个情节

另一种方法是将调用保存ggplot为未计算的表达式。然后,您只需在需要时对其进行评估。这几乎就像每次都输入代码(在某些方面有所不同,但这是我能想到的最好的类比)。

## not wild about this one
myplotcall <- expression(ggplot(dat, aes(x,y)) + geom_point())

## look at it (literally just the input)
myplotcall
expression(ggplot(dat, aes(x, y)) + geom_point())

## use it
eval(myplotcall)

第三个情节

## change it
dat <- data.frame(x = 21:30, y = runif(10))
eval(myplotcall)

第四个情节

您可以更改ggplot对象本身的数据。我认为这种方法最容易出现问题,因为您正在处理并非真正打算由用户更改的对象的内部结构(即,仅仅因为我们可以并不意味着我们应该)。这更适合由%+%操作员完成(参见 joran 的回答)

## not wild about this either
g <- ggplot(dat, aes(x,y)) + geom_point()
g ## use it

第五个情节

## change it
dat <- data.frame(x = 31:40, y = runif(10))
g$data <- dat
g

第六情节

于 2012-07-11T14:17:34.307 回答