geom_smooth的条件着色

时间:2015-10-02 13:25:52

标签: r ggplot2

我正在分析一个在零附近变化的系列。并且为了看到该系列的某些部分在哪些地方倾向于大多数是正面的或者大部分是负面的,我都会绘制一个geom_smooth。我想知道是否有可能使平滑线的颜色取决于它是否高于或低于0.以下是一些产生图形的代码,就像我想要创建的那样。

set.seed(5)
r <- runif(22, max = 5, min = -5)
t <- rep(-5:5,2)
df <- data.frame(r+t,1:22)
colnames(df) <- c("x1","x2")
ggplot(df, aes(x = x2, y = x1)) + geom_hline() + geom_line() + geom_smooth()

我考虑计算平滑值,将它们添加到df然后使用scale_color_gradient,但我想知道是否有办法直接在ggplot中实现此目的。

2 个答案:

答案 0 :(得分:8)

您可以使用n中的geom_smooth参数来增加“得分更平滑的点数”,以便创建更接近零的y值。然后使用ggplot_buildggplot对象中获取平滑值。这些值用于geom_line,它添加在原始图表的顶部。最后,我们使用geom_hline覆盖y = 0值。

# basic plot with a larger number of smoothed values
p <- ggplot(df, aes(x = x2, y = x1)) +
  geom_line() +
  geom_smooth(linetype = "blank", n = 10000)

# grab smoothed values
df2 <- ggplot_build(p)[[1]][[2]][ , c("x", "y")]

# add smoothed values with conditional color
p +
  geom_line(data = df2, aes(x = x, y = y, color = y > 0)) +
  geom_hline(yintercept = 0)

enter image description here

答案 1 :(得分:6)

这样的事情:

# loess data
res <- loess.smooth(df$x2, df$x1)
res <- data.frame(do.call(cbind, res))

res$posY <- ifelse(res$y >= 0, res$y, NA)
res$negY <- ifelse(res$y < 0, res$y, NA)

# plot
ggplot(df, aes(x = x2, y = x1)) + 
  geom_hline() + 
  geom_line() + 
  geom_line(data=res, aes(x = x, y = posY, col = "green")) +
  geom_line(data=res, aes(x = x, y = negY, col = "red")) +
  scale_color_identity()

execution plan