2017-09-25 8 views
0

ラインセグメントの色を、その前のポイントよりも大きいかどうかに基づいて変更しようとしています。私はここで間違って何をしていますか?ggplotの増減に基づくライン

例:

from [1,4] to [2,5] would be green because the y value is increasing. 
from [1,4] to [2,1] would be red because the y value is decreasing. 

マイコード:

set.seed(42) 
df<-NULL 
df$x<-rnorm(10,0,10) 
df$y<-rnorm(10,0,10) 
df$colors<-cbind(lapply(1:length(df$x),function(i){ 
    ifelse(df$x[i]>df$x[i-1],"#CC6666","#9999CC") 
})) 
df<-data.frame(df) 


ggplot()+ 
    geom_line(aes(x=df$x,y=df$y),size=1.5,colour=df$color)+ 
    scale_color_manual(values=df$color) 

答えて

1

でしょうあなたのために、この作品のようなもの、私は再配置されたあなたの例のデータビットが、我々は得るためにgeom_segment()dplyr::lead()を使用することができます色が正しく一致し、少しのggplotがハックしてラベルを再びうまく作り、NAを捨てます:

set.seed(42) 
df <- data.frame(x = rnorm(10,0,10), 
        y = rnorm(10,0,10)) 

# base R 
df <- df[order(df$x),] 
df$color <- sapply(1:nrow(df), function(i) df$y[i] > df$y[i+1]) 
df$group <- "1" 

library(tidyverse) 
df <- arrange(df, x) %>% 
    mutate(color = y > lead(y), 
      group = "1") # group everything togther or else we get two lines 

ggplot()+ 
    geom_path(data = df, 
       aes(x=x, y=y, color = color, group = group),size=1.5) + 
    scale_color_manual(values = c("#CC6666","#9999CC"), na.value = "white", 
         labels = c("increase", "decrease", "")) 

enter image description here

+0

これはうまく動作しますが、グループによって混乱しています。値が大きい場合は、変数を並べ替えて新しい列「1」を作成します。値が小さい場合は、自動的に別のグループに割り当てられますか? – Rilcon42

+0

グループはちょうどそこにあります。なぜなら、ggplotは(定義されていれば)美学に基づいてグループ化しようとしていますから、グルーとして「1」を使用して、それらをすべて同じ行に保持します。配列はちょうどx軸上の順序に関連して適切な 'i + 1'比較をしています – Nate

関連する問題