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 >
Résultat attendu:
Je ne souhaite pas utiliser ggplot2 et préférerais une solution en base R.
3 Réponses :
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
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) }) )
Suite à cette réponse [comme @Sonny l'a suggéré dans le commentaire], vous pouvez le faire en utilisant Créé le 24/03/2019 par le package reprex (v0.2.1) 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")
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.
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)
Copie possible de Tracer un graphique linéaire avec des couleurs conditionnelles en fonction de valeurs