Линия графика разных цветов выше или ниже нуля - PullRequest
2 голосов
/ 24 марта 2019

Я бы хотел, чтобы построенная линия была синей для значений выше нуля и красной для значений ниже нуля.

Пример данных:

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")

Результат:

image of resulting plot

Ожидаемый результат:

image of expected resulting plot

Я не хочу использовать ggplot2 и предпочел бы решение в базе R.

Ответы [ 3 ]

1 голос
/ 24 марта 2019

После этого ответа [как предложил @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")

Создано в 2019-03-24 пакетом Представить (v0.2.1)

1 голос
/ 24 марта 2019

Я сейчас использую clplot() из пакета plotrix :

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

0 голосов
/ 24 марта 2019

Существует очень гибкое решение из @ Kohske / @ beroe , которое также может быть адаптировано для 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...