2
votes

Tracer la ligne dans différentes couleurs au-dessus et en dessous de zéro

Je voudrais que la ligne tracée soit bleue pour les valeurs supérieures à zéro et rouge pour les valeurs inférieures à zéro.

Exemple de données:

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

Résultat: p >

 image du tracé résultant

Résultat attendu:

 image du tracé résultant attendu

Je ne souhaite pas utiliser ggplot2 et préférerais une solution en base R.


3 Réponses :


0
votes

Il existe une solution très flexible de @Kohske / @beroe , qui peut également être adapté sur lignes .

La méthode consiste à estimer les nullités.

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

Fusionner les nullites avec votre bloc de données d'origine. p>

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

Ensuite, faites un tracé vide et ajoutez des lines segmentés .

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

Résultat

 entrez la description de l'image ici

Notez que les lignes ne sont pas interrompues sur la ligne zéro, mais abline at 0 cache ce fait, nous ne devrions donc pas nous en préoccuper beaucoup dans ce cas.

Données

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


0 commentaires

1
votes

Suite à cette réponse [comme @Sonny l'a suggéré dans le commentaire], vous pouvez le faire en utilisant 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")

Créé le 24/03/2019 par le package reprex (v0.2.1)


2 commentaires

Si vous savez que cette question a déjà été posée et qu'il s'agit d'un duplicata, vous ne devez pas y répondre dans ce cas et vous devez voter pour la fermer comme duplicata.


@RonakShah Merci de m'avoir fait savoir. Je ne savais pas ça. Je ne vois aucune option vote , donc j'ai peut-être besoin de plus de réputation pour cela.



1
votes

J'utilise maintenant clplot () depuis le 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)


0 commentaires