我不知道如何把它放在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
Run Code Online (Sandbox Code Playgroud)
第二个$ g $不会产生一个情节,因此dat是$ NULL $.如何保存$ g $以便可以更改dat?
我知道这不是一个好习惯,但是我得到了一些很长的代码,我不想这么做.
就个人而言,我认为@Joshua的答案太复杂了(如果我理解你想做什么的话).
我认为更改存储在绘图对象中的数据框没有任何意义,因为ggplot2有一个特殊的中缀运算符,专门用于将新数据帧应用于给定的绘图对象:%+%
.
dat <- data.frame(x=runif(10),y=runif(10))
g <- ggplot(dat, aes(x,y)) + geom_point()
g
Run Code Online (Sandbox Code Playgroud)
#Change the data frame
dat$y <- rexp(10)
#Replot g using the altered data frame
g %+% dat
Run Code Online (Sandbox Code Playgroud)
当然,这不仅可以改变原始数据框的版本,还可以使用全新的数据框,前提是它具有所有必需的变量(并且它们的名称相同).
我认为有几种选择,我按照我的喜好顺序展示。
## setup
require(ggplot2)
set.seed(10) # make reproducible
dat <- data.frame(x=1:10,y=runif(10))
Run Code Online (Sandbox Code Playgroud)
我最喜欢的选择是为您的代码创建一个简单的函数包装器。然后,每当您需要更改数据时,只需将新数据传递给您的函数,它就会将其提供ggplot
并创建新图表。这对于问题来说是灵活且相当稳健的。它也是可扩展的,因为如果稍后您决定还希望能够更改标题,您也可以向函数添加一个标题参数。
## my favorite option
myplot <- function(data) {
ggplot(data, aes(x, y)) + geom_point()
}
## use it
myplot(data = dat)
Run Code Online (Sandbox Code Playgroud)
## change it
dat <- data.frame(x = 11:20, y = runif(10))
myplot(data = dat)
Run Code Online (Sandbox Code Playgroud)
另一种方法是将您的调用保存为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)
Run Code Online (Sandbox Code Playgroud)
## change it
dat <- data.frame(x = 21:30, y = runif(10))
eval(myplotcall)
Run Code Online (Sandbox Code Playgroud)
您可以更改对象本身的数据ggplot
。我认为这种方法最容易出现问题,因为您正在处理一个对象的内部结构,而该对象并不是真正打算由用户更改的(即,仅仅因为我们可以并不意味着我们应该)。这更适合由%+%
操作员完成(参见 joran 的回答)
## not wild about this either
g <- ggplot(dat, aes(x,y)) + geom_point()
g ## use it
Run Code Online (Sandbox Code Playgroud)
## change it
dat <- data.frame(x = 31:40, y = runif(10))
g$data <- dat
g
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1056 次 |
最近记录: |