不得不将geom乘以facet数?

时间:2016-09-29 15:53:39

标签: r plot ggplot2 facet

我希望在我的数据后面有多个矩形,但我也想使用多个方面,每个方面都会出现这些矩形。我首先运行下面的代码并得到错误: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)

然而,我意识到当我加倍 fillgeom_rect向量中的项目数时,它就有效了。我发现我必须将fill向量乘以该图所具有的方面数(例如,如果我将fs更改为c("x","y","z")我需要将fill列多个由三)。

这种行为究竟是什么?这是代码中的错误吗?如果没有,我应该如何制作我的代码,以便可以使用任意数量的方面?我不想在geom_rect中明确地编码哪些变量。

1 个答案:

答案 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()