替换具有多个数据集的现有ggplot的数据集

时间:2017-05-15 19:36:46

标签: r ggplot2

主要目标是精确控制每个刻面行的刻面ggplot的y刻度。我的策略是为每一行构建一个单独的图并将它们绑定在一起。

我想从现有的ggplot对象开始。要为每个构面行构建绘图,我计划对原始数据进行子集化,并使用运算符%+%替换数据集。 但是,当不同层上有多个数据集时,这似乎是不可能的。

是否有可能使用%+%替换ggplot中的多个/所有数据集?

以下MWE:此方法适用于第ga个图,其中第二个数据集dat2a不包含构面变量。但是,它不适用于第二个示例gb

library(ggplot2)
dat1 <- data.frame(x=runif(9),y=runif(9), b=rep(1:3,3)  )
dat2a <- data.frame(a=c(1,2),c=c(1,1))
dat2b <- data.frame(a=c(0.5,1,2),c=c(0.5,1,1),b=c(1,2,3))

ga   <- ggplot(dat1, aes(x,y)) + 
    geom_point() + 
    facet_grid(b~.) +
    geom_point(data=dat2a, aes(x=a, y=c), color='red')
gb   <- ggplot(dat1, aes(x,y)) + 
    geom_point() + 
    facet_grid(b~.) +
    geom_point(data=dat2b, aes(x=a, y=c), color='red')

# example a) working
    ga
    #Replot ga using the altered data frame
    ga %+% dat1[dat1$b==2,]
# example b) not working
    gb
    #Replot g using the altered data frame
    gb %+% dat1[dat1$b==2,]

1 个答案:

答案 0 :(得分:0)

编辑:下面的解决方法可以达到预期的效果。但是,它还会修改原始ggplot对象的数据。不知何故,复制的ggplot对象仍然与原始对象相关联。虽然解决方法回答了问题,但它无法解决问题。

在ggplot对象上使用str给了我一些提示。可以使用gb$layers访问每个图层,每个图层都有一个元素$data。这样可以找出哪个图层有自己的data.frame:

lapply(gb_new2$layers, function(layer) is.data.frame(layer$data))

事实证明,替换这些data.frames将达到预期的效果。

(虽然我不确定这次更换是否会产生不良后果,例如错误的轴缩放。或者有人可以确认此类计算仅在调用ggplot_build()后的后续步骤中执行?即我们还在处理与初始绘图定义非常相似的对象gb吗?)

以下几行提供了ggplot对象gb所需的更改。

gb_new <- gb
dat2b_extracted <- gb_new$layers[[2]]$data
gb_new$layers[[2]]$data <- dat2b_extracted[dat2b_extracted$b==2,]

gb_new %+% dat1[dat1$b==2,]

这可以使用以下自动化。虽然我不得不承认它仍然感觉非常黑客。

# copy ggplot object
gb_new2 <- gb

# edit copy of ggplot
for (it in seq_along(gb_new2$layers)){
    # get data.frame of layer
        temp_df <- gb_new2$layers[[it]]$data
    # subset and replace it
        if(is.data.frame(temp_df)) { gb_new2$layers[[it]]$data <- temp_df[temp_df$b==2,] }
}
# plot
gb_new2 %+% dat1[dat1$b==2,]