2017-10-09 93 views
0

我想获得一条线,该线通过给定点并为指定的时间间隔内的值指定颜色。但我只能得到指定颜色的多行,而不是单行,这会改变其子区间的颜色。geom_line的条件颜色

的可重复的例子如下:

require(ggplot2) 
require(plotly) 

vectX <- c(-5,-4.5,-3.2,-2.1,-0.8,0.1,1.3,2.7,3.6,4.4,5) 
vectY <- c(-2.3,1.4,2.7,0.3,-0.4,1.5,3.9,2.4,0.5,-1.2,1.4) 

requestedQuantilesZscores <- c(0.0,0.25,0.5,0.75,1.0) 
zScores <- base::scale(vectY, center = TRUE, scale = TRUE) 
quantilesZscore <- stats::quantile(zScores, requestedQuantilesZscores, na.rm = TRUE) 

theDataFrame <- base::data.frame(theX = vectX, theY = vectY, theZ = zScores) 

valuesColor <- c('green','red','blue','yellow','orange') 
theDataFrame$conditionalColor <- ifelse(theDataFrame$theZ > quantilesZscore[[4]], valuesColor[[1]] , 
     ifelse(theDataFrame$theZ > quantilesZscore[[3]] & theDataFrame$theZ <= quantilesZscore[[4]], valuesColor[[2]], 
     ifelse(theDataFrame$theZ > quantilesZscore[[2]] & theDataFrame$theZ <= quantilesZscore[[3]], valuesColor[[3]], 
      ifelse(theDataFrame$theZ <= quantilesZscore[[2]], valuesColor[[4]], valuesColor[[5]])))) 

theGGplotLine <- ggplot(theDataFrame) + 
    geom_line(aes(x = theX, y = theY, color = conditionalColor)) + 
    xlab('X') + ylab('Y') + 
    scale_colour_manual(values = valuesColor) + 
    theme(legend.position='none') 

theGGplotLine 

(plotly::ggplotly(theGGplotLine)) 
+0

如果我理解你的问题(我不能肯定我做的),那么你正在寻找的是细分一行成各种颜色。根据我所知,使用'geom_line'无法达到这个目的,您需要恢复到像geom_abline这样的图形原语和朋友分别绘制每条线。 –

回答

0

如果我正确你想要什么了解,所有你需要的是添加不同的分组到您的ggplot代码

theGGplotLine <- ggplot(theDataFrame) + 
    geom_line(aes(x = theX, y = theY, color = conditionalColor, group = 1)) + 
    xlab('X') + ylab('Y') + 
    scale_colour_manual(values = valuesColor) + 
    theme(legend.position='none') 

这使一行连接所有点,但颜色取决于conditionalColor列。分组这样也可以基于一个单独的列,如果有必要

+0

谢谢@ user2738526。你的答案提供了静态图(用ggplot2创建)的预期行为,并且它将被接受。交互式情节(与ggplotly)仍然有一些问题,但你的答案让我在正确的方向,我也能够解决它 – Aex

0

答案组合由user2738526了原来的问题提供解决方案的要素,也解决了Question 46146720

它采用geom_segment,并且使每个细分链接直到下一个(x,y)值,而不考虑颜色。

代码变得

require(ggplot2) 
require(plotly) 
require((dplyr)) 

vectX <- c(-5,-4.5,-3.2,-2.1,-0.8,0.1,1.3,2.7,3.6,4.4,5) 
vectY <- c(-2.3,1.4,2.7,0.3,-0.4,1.5,3.9,2.4,0.5,-1.2,1.4) 

requestedQuantilesZscores <- c(0.0,0.25,0.5,0.75,1.0) 
zScores <- base::scale(vectY, center = TRUE, scale = TRUE) 
quantilesZscore <- stats::quantile(zScores, requestedQuantilesZscores, na.rm = TRUE) 

theDataFrame <- base::data.frame(theX = vectX, theY = vectY, theZ = zScores) 

theDataFrame <- theDataFrame %>% 
    arrange(theX) %>% 
    mutate(theNextX = lead(theX), theNextY = lead(theY)) 

valuesColor <- c('green','red','blue','magenta','orange') 
theDataFrame$conditionalColor <- ifelse(theDataFrame$theZ > quantilesZscore[[4]], valuesColor[[1]] , 
     ifelse(theDataFrame$theZ > quantilesZscore[[3]] & theDataFrame$theZ <= quantilesZscore[[4]], valuesColor[[2]], 
       ifelse(theDataFrame$theZ > quantilesZscore[[2]] & theDataFrame$theZ <= quantilesZscore[[3]], valuesColor[[3]], 
         ifelse(theDataFrame$theZ <= quantilesZscore[[2]], valuesColor[[4]], valuesColor[[5]])))) 

theGGplotLine <- ggplot(theDataFrame, aes(x = theX, y = theY)) + 
    geom_segment(aes(xend = theNextX, yend = theNextY, color = conditionalColor)) + 
    xlab('X') + ylab('Y') + 
    scale_colour_manual(values = valuesColor) + 
    theme_bw() + 
    theme(legend.position='none') 

theGGplotLine 

(plotly::ggplotly(theGGplotLine))