2016-09-29 17 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ベクター内のアイテム数を倍増したときに、それが働いていたことに気づきました。私は、ベクトルに、プロットのファセットの数を掛けなければならないことを実証しました(例えば、fsc("x","y","z")に変更する場合は、fillの列を3倍にする必要があります)。

この動作で何が起きていますか?これはコードのバグですか?そうでない場合は、任意の数のファセットを使用できるようにコードを作成する必要がありますか? geom_rectでどの変数がファセットされているかを明示的にコード化する必要はありません。

答えて

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

これは、あなたが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

異なる塗りつぶしを使用していた他の幾何学があった場合、scale_fill_identity()はどのように使用しますか? – Zeke

+1

あなたは一つの 'fill'変数をマップすることしかできませんので、すでに異なる変数に対して' fill'を使用していた場合、このアプローチはうまくいきません。塗りつぶし設定を書き出す必要がある場合は、ファセット変数の一意の値の数を繰り返す回数として、常にベクトルに 'rep'を使用することができます。 – aosmith

関連する問題