抱歉,如果这是一个重复的问题,但我尝试过的其他答案并未产生我想要的情节。
我想根据该值是正值还是负值(我称之为“阶段”)对该图进行颜色编码。
当 geom_line() 达到 0 的上方或下方时,我希望它的颜色为“正”或“负” - 我认为以下方法可行,但似乎不起作用。有人能告诉我哪里出了问题吗?谢谢。
] 1
structure(list(Date = c(1876, 1877, 1878, 1879, 1880, 1881),
value = c(4.95, -10.0416666666667, 2.95, 12.85, 7.8, -4.76666666666667
), phase = structure(c(3L, 1L, 3L, 3L, 3L, 1L), .Label = c("negative",
"neutral", "positive"), class = "factor")), row.names = c(NA,
-6L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x7ffb06817ce0>)
Run Code Online (Sandbox Code Playgroud)
## create a column to determine if the phase is negative, positive or neutral i.e. 0
dd_avg$phase<-factor(sign(dd_avg$value), (-1):1, c('negative', 'neutral', 'positive'))
dd_avg
## plot it up
ggplot(data=dd_avg, aes(x=Date, y=value, group=Date, colour=phase))+
geom_line()
Run Code Online (Sandbox Code Playgroud)
通过手动分配颜色,您将触发 ggplot2 所做的自动分组,这只会为正数和负数绘制单独的线。然而,即使您覆盖分组,您仍然面临这样的问题:线段只能有单一颜色,并且穿过 0 线的线可能会出现问题。
此类问题的通常解决方案是对数据进行插值以指定精确的交叉点。然而,这样做很烦人。相反,我们可以使用ggforce::geom_link2()已经插值的内容并after_stat()在插值后应用着色。如果您需要准确的交叉点,您可能需要自己进行插值。
library(ggplot2)
library(ggforce)
df <- data.frame(
x = seq(as.Date("1890-01-01"), as.Date("2020-01-01"), by = "1 year"),
y = rnorm(131)
)
ggplot(df, aes(x, y)) +
geom_link2(aes(colour = after_stat(ifelse(y > 0, "positve", "negative"))))
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v1.0.0)于 2021-06-28 创建