高于/低于线性趋势线的值的不同颜色

时间:2016-02-19 10:28:07

标签: r ggplot2

我正在使用ggplot绘制一个带有线性回归线的时间序列。我想为时间序列设置不同的颜色,具体取决于它是在趋势线的上方还是下方。

下面是一个代码示例,用于绘制系列和相应的趋势线,以及系列和线条的不同颜色:

x  <- seq(as.Date("2000/1/1"), as.Date("2010/1/1"), "years")
y  <- rnorm(length(x),0,10)
df <- data.frame(x,y)

ggplot(df, aes(x, y)) + 
  stat_smooth(method = 'lm', aes(colour = 'Trend'), se = FALSE) +
  geom_line(aes(colour = 'Observation') ) +   
  theme_bw() + 
  xlab("x") + 
  ylab("y") + 
  scale_colour_manual(values = c("blue","red"))

度过美好的一天!

1 个答案:

答案 0 :(得分:2)

我摆脱了约会,因为他们让我疯了。也许有人可以为此添加解决方案。否则看起来很可行,有一些基本的高中数学。

df <- data.frame(x = 2000:2010,
                 y = rnorm(11, 0, 10))
fm <- lm(y ~ x, data = df)
co <- coef(fm)
df$under_over <- sign(fm$residuals)
for (i in 1:(nrow(df) - 1)) {
  # Get slope and intercept for line segment
  slope <- (df$y[i + 1] - df$y[i]) / (df$x[i + 1] - df$x[i])
  int  <- df$y[i] - slope * df$x[i]
  # find where they would cross
  x <- (co[1] - int) / (slope - co[2])
  y <- slope * x + int
  # if that is in the range of the segment it is a crossing, add to the data
  if (x > df$x[i] & x < df$x[i + 1])
    df <- rbind(df, c(x = x, y = y, under_over = NA))
}
#order by x
df <- df[order(df$x), ]
# find color for intersections
for (i in 1:nrow(df))
  if (is.na(df$under_over[i]))
    df$under_over[i] <- df$under_over[i + 1]

ggplot(df) +
  geom_abline(intercept = co[1], slope = co[2]) +
  geom_path(aes(x, y, col = as.factor(under_over), group = 1)) +
  theme_bw()

enter image description here