Соединение по отсутствующим значениям с помощью geom_line

Я пытаюсь выяснить, можно ли подключаться к отсутствующим значениям с помощью geom_line. Например, в приведенной ниже ссылке отсутствуют значения в момент времени 3 в гране F. Я бы хотел, чтобы линия соединяла время 2 и 4 в этом случае. Есть ли способ достичь этого?

https://farm8.staticflickr.com/7061/6964089563_b150e0c2a6.jpg

У меня есть кадр данных с такими же значениями:

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

Что я рисую с помощью:

ggplot(cumulative, aes(x=Time,y=Value, shape=series)) + 
    geom_point() + 
    geom_line(aes(linetype=series)) + 
    facet_wrap(~ individual, ncol=3)

Ответы

Ответ 1

Ответ Ричи очень тщательный, но я хотел показать что-то более простое. Поскольку линии не обращаются к точкам NA, другой подход - это падение этих точек при рисовании линий. Это неявно делает линейную интерполяцию между точками (как прямые).

Используя dfr ответ Ричи, не требуя вычисления шага z:

ggplot(dfr, aes(x,y)) + 
  geom_point() +
  geom_line(data=dfr[!is.na(dfr$y),])

В этом случае подмножество может быть сделано для всего этого.

ggplot(dfr[!is.na(dfr$y),], aes(x,y)) + 
  geom_point() +
  geom_line()

Ответ 2

Строки не рисуются, если значение NA. Вы должны заменить их путем интерполяции по отсутствующим точкам. Существует множество различных алгоритмов для интерполяции, вам нужно поэкспериментировать с несколькими и посмотреть, какой из них лучше подходит вашим данным. В этом примере используется линейная интерполяция через interp1 в пакете pracma.

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

dfr <- data.frame(
  x = 1:10,
  y = runif(10)
)
dfr[c(3, 6, 7), "y"] <- NA

Шаг интерполяции:

dfr$z <- with(dfr, interp1(x, y, x, "linear"))

Сравнить графики:

ggplot(dfr, aes(x, y)) + geom_line()
ggplot(dfr, aes(x, z)) + geom_line()

Если вы показываете этот график другим людям, убедитесь, что вы четко отмечаете места, где вы синтезировали данные, путем интерполяции (возможно, используя пунктирные линии).


Обновление на основе комментария:
Вы можете указать различные эстетики для разных геометров.

ggplot(dfr, aes(x)) + 
  geom_point(aes(y = y)) +
  geom_line(aes(y = z))

Чтобы включить разные типы линий для отсутствия/отсутствия пропущенных y, вы можете сделать что-то вроде

ggplot(dfr, aes(x)) + 
  geom_point(aes(y = y)) +
  geom_line(aes(y = y)) +
  geom_line(aes(y = z), linetype = "dotted")