我想绘制一个带有正负值的不同颜色的折线图。 不幸的是,密谋有些错误。 0旁边的几个值显示的颜色错误。
代码:
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
有什么想法为什么绘图不起作用?
答案 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)
您可以使用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)