我认为有几种选择,我按照我的喜好显示。
## 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-11 11:44:40
实际上,无论dat是否设置为NULL,“第二个g”都会生成一个图。并且g包含数据:尝试输入g $数据。 – neilfws 2012-07-11 12:10:18
我们需要版本号码,人员! packageDescription(“ggplot2”)$ Version = 0.9.1,g有一个$ data元素中数据的副本。我不敢相信这会改变。要保留对数据的引用,以便在数据发生变化时绘图发生变化将是一件非常奇怪的事情... – Spacedman 2012-07-11 14:52:32