2016-09-29 51 views
0

我想背後有我的數據的多個矩形,但我也想用多個方面,每一個它的這些矩形會出現在我第一次運行下面的代碼,並得到了錯誤: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) 

但是,我意識到,當我在一倍geom_rectfill載體項目的數量,它的工作。我得出結論,我必須乘以fill向量除以圖的面數(例如,如果我將fs更改爲c("x","y","z"),則需要將fill列的倍數乘以3)。

這是怎麼回事?這是代碼中的錯誤嗎?如果沒有,我應該如何編寫我的代碼,以便可以使用任意數量的方面?我不想明確地編寫geom_rect中的哪些變量。

回答

1

正如你所想,你正在繪製12個矩形(每個面6個矩形)。所以ggplot需要爲每個填充顏色或填充顏色標識。

比重複填充顏色更容易的解決方法是通過將每個矩形的填充顏色放入矩形數據框中來利用美學貼圖。

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")) 

這可以讓你的geom_rectaes內映射fill給一個變量。使用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() 
+0

如果您還有其他geoms使用不同的填充,但是如何使用scale_fill_identity()? – Zeke

+1

你只能有一個'fill'變量映射,所以如果你已經對不同的變量使用了'fill',這種方法將不起作用。如果您必須寫出填充設置,則可以始終在矢量上使用「rep」,並使用faceting變量中的唯一值數作爲重複次數。 – aosmith