2015-10-02 11 views
8

私は、0を中心に変化する系列を分析しています。そして、ほとんどがポジティブであるかほとんどがマイナスである傾向のあるシリーズの部分があるかを見るために、私はgeom_smoothをプロットしています。滑らかな線の色を0よりも上か下かに依存させることが可能かどうか疑問に思っていました。以下は、私が作成しようとしているようなグラフを生成するコードです。geom_smoothの条件付き塗りつぶし

set.seed(5) 
r <- runif(22, max = 5, min = -5) 
t <- rep(-5:5,2) 
df <- data.frame(r+t,1:22) 
colnames(df) <- c("x1","x2") 
ggplot(df, aes(x = x2, y = x1)) + geom_hline() + geom_line() + geom_smooth() 

私は、平滑化値を計算DFにそれらを追加し、scale_color_gradientを使用して考えられるが、直接ggplotでこれを達成するための方法がある場合、私は思っていました。

+0

この行は何をしているのですか? 'values(t)<-1:5' – zx8754

+0

絶対に何もありません。今すぐ削除しました。 –

+0

@MarijnStevering私はあなたのコードを実行すると、エラーが発生しました: "エラー:geom_hlineは、次の見逃している美学が必要です:yintercept"。追加することもできます(実際の問​​題では 'geom_hline'は必要ありません)。いい最初の質問は+1。 – Henrik

答えて

7

あなたがゼロに近いいくつかのより多くのyの値を作成するために、「で滑らかに評価するポイント数を」増やすgeom_smoothn引数を使用することができます。次にggplot_buildを使用して、ggplotオブジェクトから平滑化された値を取得します。これらの値はgeom_lineで使用され、元のプロットの上に追加されます。最後に、y = 0の値をgeom_hlineで上書きします。

# basic plot with a larger number of smoothed values 
p <- ggplot(df, aes(x = x2, y = x1)) + 
    geom_line() + 
    geom_smooth(linetype = "blank", n = 10000) 

# grab smoothed values 
df2 <- ggplot_build(p)[[1]][[2]][ , c("x", "y")] 

# add smoothed values with conditional color 
p + 
    geom_line(data = df2, aes(x = x, y = y, color = y > 0)) + 
    geom_hline(yintercept = 0) 

enter image description here

6

このような何か:

# loess data 
res <- loess.smooth(df$x2, df$x1) 
res <- data.frame(do.call(cbind, res)) 

res$posY <- ifelse(res$y >= 0, res$y, NA) 
res$negY <- ifelse(res$y < 0, res$y, NA) 

# plot 
ggplot(df, aes(x = x2, y = x1)) + 
    geom_hline() + 
    geom_line() + 
    geom_line(data=res, aes(x = x, y = posY, col = "green")) + 
    geom_line(data=res, aes(x = x, y = negY, col = "red")) + 
    scale_color_identity() 

enter image description here

+1

良いアイデアですが、いくつかの望ましくない問題があります... – tonytonov

+0

@tonytonov私は気づいています。今は時間がないので、OPが始めることができるように共有するかもしれないと思って、自由に編集してください。 – zx8754

+0

@tonytonovが更新されましたが、もう少し仕事が必要です... – zx8754