以零以上和以下不同颜色绘制线

时间:2019-03-24 08:21:27

标签: r plot colors

我希望对于零以上的值,绘制的线为蓝色,对于零以下的值,绘制的线为红色。

样本数据:

dat <- data.frame(1:10, c(-2, -3, -1, 1, 2, 1, -2, 2, 4, 3))
plot(dat, type = "l", lwd = 2)
abline(h = 0, col = "grey")

结果:

script

预期结果:

image of resulting plot

我不想使用ggplot2,而是希望在R底下找到解决方案。

3 个答案:

答案 0 :(得分:1)

this answer之后(按照评论中的@Sonny的建议),您可以使用clip

dat <- data.frame(u = 1:10,
                  v = c(-2, -3, -1, 1, 2, 1, -2, 2, 4, 3))
plot(dat, type = "l", lwd = 2, col = "blue")
clip(x1 = min(dat$u),
     x2 = max(dat$u),
     y1 = min(dat$v),
     y2 = 0)
lines(dat, lwd = 2, col = "red")
abline(h = 0, col = "grey")

reprex package(v0.2.1)于2019-03-24创建

答案 1 :(得分:1)

我现在正在使用plotrix软件包中的clplot()

dat <- data.frame(1:10, c(-2, -3, -1, 1, 2, 1, -2, 2, 4, 3))
library(plotrix)
clplot(dat[, 1], dat[, 2], levels = c(0), cols = c("red", "blue"), lwd = 2)

enter image description here

答案 2 :(得分:0)

周围有一个来自{em> @Kohske / @beroe 的very flexible solution,也可以在lines上进行修改。

该方法是您估算无效值。

dat.add <- do.call(rbind, 
                 sapply(1:(nrow(dat) - 1), function(i) {
                   f <- lm(x ~ y, dat[i:(i + 1), ])
                   if (f$qr$rank < 2) return(NULL)
                   r <- predict(f, newdata=data.frame(y=0))
                   if(dat[i, ]$x < r & r < dat[i + 1, ]$x)
                     return(data.frame(x=r, y=0))
                   else return(NULL)
                 })
)

将空值合并到原始数据框中。

dat <- merge(dat, dat.add, all=TRUE)

然后做一个空图并添加分段的lines

plot(dat, lwd = 2, type="n")
lines(dat[dat$y >= 0, ], col="blue")
lines(dat[dat$y <= 0, ], col="red")
abline(h = 0, col = "grey")

结果

enter image description here

请注意,这些行不会在零行上中断,但是abline处的0隐藏了这一事实,因此在这种情况下我们不必太在意。

数据

dat <- structure(list(x = 1:10, y = c(-2, -3, -1, 1, 2, 1, -2, 2, 4, 
3)), class = "data.frame", row.names = c(NA, -10L))