用正负值绘制不同颜色的折线图

时间:2019-05-03 14:48:51

标签: r ggplot2

我想绘制一个带有正负值的不同颜色的折线图。 不幸的是,密谋有些错误。 0旁边的几个值显示的颜色错误。

enter image description here

代码:

set.seed(345); df2 <- data.frame(date=1:100, y=cumsum(runif(100)-0.5))
d <- ggplot2::ggplot( df2, ggplot2::aes(date, y) ) +
   ggplot2::geom_line( ggplot2::aes( group = 1, color= (y < 0)));d

有什么想法为什么绘图不起作用?

1 个答案:

答案 0 :(得分:0)

geom_line()将使用当前点的值从当前点到下一个点着色。我希望此图表有助于解释:

set.seed(345)

df2 <- 
  data.frame(
    date = 1:100, 
    y = cumsum(runif(100) - 0.5)
  ) %>% 
  mutate(line_color = y < 0) 

ggplot(slice(df2, 60:85), aes(date, y, color = line_color)) +
  geom_segment(
    aes(
      x = (date), xend = lead(date), 
      y = (y), yend = lead(y)
    ), 
    arrow = arrow(length = unit(0.15, "inches"), ends = "first"),
    size = 1
  ) +
  geom_point(size = 3) +
  geom_hline(yintercept = 0)

enter image description here

您可以使用lead()lag()逻辑来提前确定所需的颜色。此示例将为任何值小于或等于0的颜色着色。即使80左右的点大于零,该线仍保持蓝绿色,因为其前后的点小于零。

df2 %>% 
mutate(line_color =  y < 0 | lead(y, default = first(y)) < 0) %>%
ggplot(aes(date, y, color = line_color)) +
  geom_line(aes(group = 1)) +
  geom_point(aes(color = y < 0), size = 3) +
  geom_hline(yintercept = 0)

enter image description here