主要目标是精确控制每个刻面行的刻面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,]
答案 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,]