GGPLOT2:创建从ggplot-对象的独立副本(ggplot2: Create an indep

2019-09-19 08:27发布

我不知道如何把这个OO-演讲。 但是,当你创建一个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可以改变的?

我知道这是不好的做法,但我得到了一些很长的代码上,我不想去拨弄一下。

Answer 1:

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

我不认为这有什么意义改变存储在剧情对象的数据帧,因为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

这工作,当然,与原始数据帧的不只是更改后的版本,而是一个全新的数据帧,只要有其中的所有必需的变量(和它们的命名一样)。



Answer 2:

我觉得有几个选项,我表现出我的优先顺序。

## 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



文章来源: ggplot2: Create an independent copy from an ggplot-Object
标签: r oop ggplot2