линия, соединяющая отсутствующие данные R

Мне нужен линейный график в R дней, которые птица провела вдали от своего гнезда. У меня отсутствуют данные, что затрудняет отображение общей тенденции. Я хочу заменить линию для дней, по которым у меня нет информации, пунктирной линией. Я совершенно не знаю, как это сделать. Возможно ли это сделать в R?

     > time.away.1
   hrs.away days.rel
1     0.380       -2
2     0.950       -1
3     1.000        0
4     0.200        1
5     0.490       12
6     0.280       13
7     0.130       14
8     0.750       20
9     0.160       21
10    1.830       22
11    0.128       26
12    0.126       27
13    0.500       28
14    0.250       31
15    0.230       32
16    0.220       33
17    0.530       40
18    3.220       41
19    0.430       42
20    1.960       45
21    1.490       46
22   24.000       56
23   24.000       57
24   24.000       58
25   24.000       59
26   24.000       60
27   24.000       61

Моя попытка:

plot(hrs.away ~ days.rel, data=time.away.1,
     type="o",
     main="Time Away Relative to Nest Age",
     ylab="Time spent away",
     xlab="Days Relative to Initiation",
     ylim=c(0,4))

Вот как сейчас выглядит мой график


person JennaM    schedule 19.10.2015    source источник
comment
Возможно, вы захотите включить код, который вы использовали для создания текущего графика?   -  person jeremycg    schedule 19.10.2015
comment
это не совсем то, что у меня было, я не могу найти код, который я использовал для его создания (это было еще в мае), и теперь я действительно пинаю себя за то, что не сохранил точный код. Но я только возился с тем, как это выглядело. Это практически одно и то же.   -  person JennaM    schedule 19.10.2015
comment
Я хочу, чтобы сплошная линия представляла, за какие дни у меня есть данные, а пунктирная линия — за какие данные у меня нет данных.   -  person JennaM    schedule 19.10.2015
comment
Да. Если это имеет смысл. Сейчас похоже, что у меня есть данные за каждый день, что не соответствует действительности.   -  person JennaM    schedule 19.10.2015


Ответы (1)


Вот способ использования diff для создания переменной, определяющей, отсутствует ли последовательность. Обратите внимание, что я переименовал ваши данные в dat

## make the flag variable
dat$type <- c(TRUE, diff(dat$days.rel) == 1)

plot(hrs.away ~ days.rel, data=dat,
     type="p",
     main="Time Away Relative to Nest Age",
     ylab="Time spent away",
     xlab="Days Relative to Initiation",
     ylim=c(0,4))
legend("topright", c("missing", "sampled"), lty=c(2,1))

## Add line segments
len <- nrow(dat)
with(dat,
     segments(x0=days.rel[-len], y0=hrs.away[-len],
              x1=days.rel[-1], y1=hrs.away[-1],
              lty=ifelse(type[-1], 1, 2),
              lwd=ifelse(type[-1], 2, 1))
     )

введите здесь описание изображения

Для версии ggplot вы можете создать еще один data.frame с запаздывающими переменными, использованными выше,

library(ggplot2)
dat2 <- with(dat, data.frame(x=days.rel[-len], xend=days.rel[-1],
                             y=hrs.away[-len], yend=hrs.away[-1],
                             type=factor(as.integer(type[-1]))))

ggplot() +
  geom_point(data=dat, aes(x=days.rel, y=hrs.away)) +
  geom_segment(data=dat2, aes(x=x, xend=xend, y=y, yend=yend, lty=type, size=type)) +
  scale_linetype_manual(values=2:1) +
  scale_size_manual(values=c(0.5,1)) +
  ylim(0, 4) + theme_bw()

введите здесь описание изображения

person Rorschach    schedule 19.10.2015