Соединение по отсутствующим значениям с помощью 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")