我希望在我的数据后面有多个矩形,但我也想使用多个方面,每个方面都会出现这些矩形。我首先运行下面的代码并得到错误:Aesthetics must be either length 1 or the same as the data (12): fill
这是我的代码:
block_rects <- data.frame(xstart_rect=c(-0.5, 0.5, 1.5, 2.5, 3.5, 4.5),
xend_rect=c(0.5, 1.5, 2.5, 3.5, 4.5, 5.5))
df <- data.frame(xs=c(1,2,3),ys=c(1,2,3),cond=c("a","b","f"),fs=c("x","x","y"))
df %>% ggplot(aes(x=xs,y=ys,color=cond)) +
geom_rect(inherit.aes = FALSE,
data = block_rects, aes(xmin = xstart_rect, xmax = xend_rect,
ymin = -Inf, ymax = Inf),
fill = c("#f1f1f1", "white","white","white","#f1f1f1","white")) +
geom_point() +
facet_wrap(~ fs)
然而,我意识到当我加倍 fill
中geom_rect
向量中的项目数时,它就有效了。我发现我必须将fill
向量乘以该图所具有的方面数(例如,如果我将fs
更改为c("x","y","z")
我需要将fill
列多个由三)。
这种行为究竟是什么?这是代码中的错误吗?如果没有,我应该如何制作我的代码,以便可以使用任意数量的方面?我不想在geom_rect
中明确地编码哪些变量。
答案 0 :(得分:1)
正如您所知,您正在绘制12个矩形(每个面中有6个矩形)。因此ggplot要求为每个颜色确定整体填充颜色或填充颜色。
比重复填充颜色更简单的解决方法是通过将每个矩形的填充颜色放入矩形data.frame中来利用美学映射。
block_rects <- data.frame(xstart_rect=c(-0.5, 0.5, 1.5, 2.5, 3.5, 4.5),
xend_rect=c(0.5, 1.5, 2.5, 3.5, 4.5, 5.5),
fill = c("#f1f1f1", "white","white","white","#f1f1f1","white"))
这样,您就可以将fill
映射到aes
geom_rect
内的变量。使用scale_fill_identity
使用给定的颜色名称。
ggplot(df, aes(x=xs,y=ys,color=cond)) +
geom_rect(inherit.aes = FALSE,
data = block_rects, aes(xmin = xstart_rect, xmax = xend_rect,
ymin = -Inf, ymax = Inf, fill = fill)) +
geom_point() +
facet_wrap(~ fs) +
scale_fill_identity()