J'essaie de comprendre s'il est possible de se connecter entre les valeurs manquantes à l'aide de geom_line. Par exemple, dans le lien ci-dessous, il y a des valeurs manquantes à l'instant 3 dans la facette F. J'aimerais qu'une ligne relie les heures 2 et 4 dans ce cas. Existe-t-il un moyen d'y parvenir?
https://farm8.staticflickr.com/7061/6964089563_b150e0c2a6.jpg
J'ai un bloc de données de valeurs cumulatives comme ceci:
head(cumulative)
individual series Time Value
1 A x 1 -1.008821
2 A x 2 -2.273712
3 A x 3 -3.430610
4 A x 4 -4.618860
5 A x 5 -4.893075
6 A x 6 -5.836532
Avec laquelle je complote:
ggplot(cumulative, aes(x=Time,y=Value, shape=series)) +
geom_point() +
geom_line(aes(linetype=series)) +
facet_wrap(~ individual, ncol=3)
La réponse de Richie est très approfondie, mais je voulais montrer quelque chose de plus simple. Comme les lignes ne sont pas dessinées sur NA
points, une autre approche consiste à supprimer ces points lors du dessin de lignes. Cela crée implicitement une interpolation linéaire entre les points (comme le font les lignes droites).
Utiliser dfr
à partir de la réponse de Richie, sans avoir besoin du calcul de z
étape:
ggplot(dfr, aes(x,y)) +
geom_point() +
geom_line(data=dfr[!is.na(dfr$y),])
D'ailleurs, dans ce cas, le sous-ensemble pourrait être fait pour le tout.
ggplot(dfr[!is.na(dfr$y),], aes(x,y)) +
geom_point() +
geom_line()
Les lignes ne sont pas dessinées si une valeur est NA
. Vous devez les remplacer en interpolant les points manquants. Il existe de nombreux algorithmes d'interpolation différents, vous devez en expérimenter plusieurs et voir lequel convient le mieux à vos données. Cet exemple utilise une interpolation linéaire via interp1
dans le package pracma
.
Exemples de données:
dfr <- data.frame(
x = 1:10,
y = runif(10)
)
dfr[c(3, 6, 7), "y"] <- NA
Étape d'interpolation:
dfr$z <- with(dfr, interp1(x, y, x, "linear"))
Comparer les parcelles:
ggplot(dfr, aes(x, y)) + geom_line()
ggplot(dfr, aes(x, z)) + geom_line()
Si vous montrez ce graphique à d'autres personnes, assurez-vous de marquer clairement les endroits où vous avez synthétisé les données en interpolant (peut-être en utilisant des lignes pointillées).
Mise à jour basée sur un commentaire:
Vous pouvez spécifier différentes esthétiques pour différentes géométries.
ggplot(dfr, aes(x)) +
geom_point(aes(y = y)) +
geom_line(aes(y = z))
Pour incorporer différents types de ligne pour y manquant/non manquant, vous pouvez faire quelque chose comme
ggplot(dfr, aes(x)) +
geom_point(aes(y = y)) +
geom_line(aes(y = y)) +
geom_line(aes(y = z), linetype = "dotted")