2016-08-25 2 views
0

私は1つの変数で複数のプロットを分割し、各プロットで別の変数に基づいて色分けします。R ggplotは特定の値の色を設定します

set.seed(12345) 
dates = seq(as.Date("2000-01-01"), as.Date("2016-01-01"), by = 1) 
dd = data.table(date = dates, value = rnorm(length(dates))) 
dd[, year := lubridate::year(date)] 
dd[, c := cut(value, c(-Inf, -3, 3, Inf))] 

for (thisyear in 2000:2015) { 
    ggplot(dd[year == thisyear]) + 
    geom_ribbon(aes(x = date, ymin = -Inf, ymax = Inf, fill = c), alpha = 0.1) 
} 

dd[, length(unique(c)), by = year] 

    year V1 
1: 2000 1 
2: 2001 2 
3: 2002 2 
4: 2003 3 
5: 2004 3 
.... 

ここで、毎年同じユニークなカット値の長さを持つわけではないので、異なるプロットの色は矛盾します。さらに悪いことに、1年にすべて(-Inf,3]値(当然ありそうもない)があり、もう1年がすべて[3,Inf)の値を持つ場合、それらは両方とも2つのプロットで赤色になります。

(-Inf, 3]は常に青色で、(-3,3]は常に緑色になるように指定することはできますか?

+0

緑色の点は '(3、Inf)'を意味しますか? –

+0

エラーを再現できません。 'for'ループにエラーがありますか?' thisyear'は何ですか? – bVa

+0

コードにはいくつかのタイプミスがあります:1. 2000年:2015年はおそらく '2000年に今年:2015年 'を読むべきでしょう。2.' dd [年==今年] 'は' dd [年==今年]、 –

答えて

1

使用する色を手動で指定する方法の1つは、使用するプロットの色を指定してデータフレームに列を作成することです。例えば

# scatter plot 
dd$color <- ifelse(dd$value <= 3, 'blue', 'green') 
ggplot(dd, aes(date, value)) + geom_point(colour=dd$color) 

# ribbon plot 
thisyear <- '2001' 
dd_year <- dd[year == thisyear,] 
ggplot(dd_year, aes(date, group=color, colour=color)) + 
    geom_ribbon(aes(ymin=value - 1, ymax=value + 1, fill=color), alpha=0.5) + 
    scale_fill_manual(values=unique(dd_year$color)) + 
    scale_color_manual(values=unique(dd_year$color)) 

これはすべての点< = 3が青色に着色され、残りのものは緑色をもたらすであろう。そこここに緑色ます唯一のデータポイントがあるだけで、それは次のようになりますおそらく以来

は、最も興味深い例:

ggplot2 colored ribbon plot

+0

ありがとうございます。これは 'geom_ribbon'の' fill'プロパティでは動作しません。複数の色を持つ 'aes'に' fill'を入れたり、 'aes'の外に定数' fill'を入れたりすることができます – jf328

+0

リボンプロットの例を追加しました。 –

+0

'geom_ribbon'コードは、2000年にシミュレートされたデータに1つのカットグループしかないために機能します。 'thisyear = 2001'を設定すると失敗します – jf328

1

あなたはに渡す色の名前のベクトルを作成することができますscale_fill_manual。これにより、各グループの色を選択することができます。また、各プロットがグループ間で同じ色になるようにすることもできます。

colors = c("blue", "green", "red") 
names(colors) = levels(dd$c) 

(-Inf,-3] (-3,3] (3, Inf] 
    "blue" "green"  "red" 

今、同じプロットですが、scale_fill_manualが追加されました。

for (thisyear in 2000:2015) { 
    print(ggplot(dd[year == thisyear]) + 
     geom_ribbon(aes(x = date, y = value, ymin = -Inf, ymax = Inf, fill = c), alpha = 0.1) + 
     scale_fill_manual(values = colors)) 
} 
関連する問題