R ggplot内部覆盖绘图对象

时间:2018-11-12 09:28:40

标签: r object ggplot2

我突然遇到ggplot的可怕问题,我的原始绘图对象在某种程度上被内部覆盖了。

p基于数据帧s的子集d。更改s后,图p会自动更改:

library(ggplot2)

#data
d<-data.frame(
  t=c(-1, 2, -3,  4, -5,  6),
  order=1:6
)
#subset data
s<-d[4:6,]
#create plot
p<-
  ggplot() +
  geom_point(aes(x=s$t,y=1:nrow(s)),size=3,col="black")  

#first plot print
p

#back to original data
s<-d

#second plot print
p #plot changed according to the new data frame

第一个情节给出: first plot

第二个图给出: second plot

1 个答案:

答案 0 :(得分:1)

除非您是ggplot2的专家,并且需要做一些相当复杂的事情,否则您应该永远永远永远使用向量vs将列映射为aes()参数,并且确实也应尽量避免在$中选择aes()个选定列。这就是您的问题(看起来您似乎也在尝试使用ggplot2,就像使用基本图形绘制一样,这是一条充满危险的道路)。

library(ggplot2)

data.frame(
  t = c(-1, 2, -3,  4, -5,  6),
  order = 1:6
) -> d

s <- d[4:6,]

现在,执行适当的ggplot2习惯用法,并添加一列要使用的y美学元素。由于我们不知道您想做什么,我随机选择了idx这个名字。

s$idx <- 1:nrow(s)

现在/再次,执行正确的ggplot2习惯用语,并将数据帧传递到ggplot()中,然后将列映射到美学 $

ggplot(s) +
  geom_point(
    aes(t, idx), size = 3, color = "black"
  ) -> p

问题在于,在构造图表之前,ggplot2不会对参数进行任何操作。懒惰地评估它们,因此当您尝试更改s 对其进行绘制时,它将选择“新” s