我注意到ggplot
的行为异常。我想一个接一个地创建多个图形,同时在它们之间重新分配数据变量。问题是ggplot
对先前保存的图形使用新值。
这是行为的一个简单示例,但是请记住,这是较大工作流的一部分,在该工作流中,我创建了多个图,并在最后用grid.arrange
将它们加入。
resp <- iris$Sepal.Length
p <- ggplot(iris, aes(x = Petal.Length, y = resp))+
geom_point()
p
这是正常的情节:
现在,我重新分配resp
,但我希望p
不会改变。但是,确实如此!
resp <- iris$Sepal.Width
p
这是更改的图:
如您所见,p
现在将iris$Sepal.Width
用作y,这不是期望的行为。为什么会这样,我如何按照自己的方式进行此工作?
有趣的是,当绘图处于函数中时,它可以正常工作。不过,如果没有这种解决方法,我仍然想要一个解决方案。
irisplot <- function(resp){
panel <- ggplot(iris, aes(Petal.Length, resp))+
geom_point()
return(panel)
}
q1 <- irisplot(iris$Sepal.Length)
q2 <- irisplot(iris$Sepal.Width)
q1 #as expected
答案 0 :(得分:1)
ggplot2将传递到data
参数的data.frame保存在ggplot对象中。对于aes
中引用但不在data.frame中的任何内容,必须在构建图时(每次打印时)依靠作用域来找到它。
因此,只需确保将resp
也传递给data
参数。
resp <- iris$Sepal.Length
p <- ggplot(cbind(iris, resp), aes(x = Petal.Length, y = resp))+
geom_point()
p
resp <- iris$Sepal.Width
p
#same plot
PS:该函数示例很好用,因为q1
和q2
的绘图环境是在函数调用期间创建的环境,而p
的绘图环境是全局环境。比较p$plot_env
和q1$plot_env
并检出ls(q1$plot_env)
。