geom_line的条件颜色

时间:2017-10-09 21:52:33

标签: r ggplot2 plotly ggplotly

我希望获得一条线路,通过给定的点并为指定间隔内的值指定颜色。但我只能获得指定颜色的多行而不是一行会改变其子间隔的颜色。

可重复的例子如下:

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

2 个答案:

答案 0 :(得分:1)

答案结合了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)) 

答案 1 :(得分: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列。如果需要,这样的分组也可以基于单独的列