web-dev-qa-db-fra.com

Connexion entre les valeurs manquantes avec geom_line

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

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()
44
Brian Diggs

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")
11
Richie Cotton