重新分配数据变量时,ggplot存在问题

时间:2019-10-16 12:59:12

标签: r ggplot2

我注意到ggplot的行为异常。我想一个接一个地创建多个图形,同时在它们之间重新分配数据变量。问题是ggplot对先前保存的图形使用新值。

这是行为的一个简单示例,但是请记住,这是较大工作流的一部分,在该工作流中,我创建了多个图,并在最后用grid.arrange将它们加入。

resp <- iris$Sepal.Length
p <- ggplot(iris, aes(x = Petal.Length, y = resp))+
    geom_point()
p

这是正常的情节:

normal plot

现在,我重新分配resp,但我希望p不会改变。但是,确实如此!

resp <- iris$Sepal.Width
p

这是更改的图:

changed plot

如您所见,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

此外,我读到在aes()中使用向量(例如thisthis)可能不是一个好习惯,因此,我也欢迎解决此问题的解决方案。

1 个答案:

答案 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:该函数示例很好用,因为q1q2的绘图环境是在函数调用期间创建的环境,而p的绘图环境是全局环境。比较p$plot_envq1$plot_env并检出ls(q1$plot_env)