2017-05-15 26 views
0

主要目标是精细控制每个facet行的分面ggplot的y-scale。我的策略是为每一行建立一个单独的图并将它们绑定在一起。替换具有多个数据集的现有ggplot的数据集

我想从现有的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

什么是'dat'?你确定你打算在方括号中调用'dat',而不是'dat1',例如。 'gb%+%dat1 [dat1 $ b == 2,]'。 –

+0

确实'dat'应该是'dat1',很好的发现。我用修正编辑了代码。 (还添加了库ggplot2)。现在该示例应该正在运行。 – fber

回答

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,] 
+0

我刚刚注意到这会导致我的预期用例出现一些错误。似乎复制ggplot对象不会复制底层数据。然后改变ggplot对象'gb_new2'的数据也会改变原始'gb'的数据。另见http://stackoverflow.com/questions/11431861/ggplot2-create-an-independent-copy-from-an-ggplot-object – fber

相关问题