我希望对于零以上的值,绘制的线为蓝色,对于零以下的值,绘制的线为红色。
样本数据:
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")
结果:
预期结果:
我不想使用ggplot2,而是希望在R底下找到解决方案。
答案 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)
答案 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")
结果
请注意,这些行不会在零行上中断,但是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))