Построение временных интервалов в виде сегментов - PullRequest
1 голос
/ 15 марта 2019

У меня есть следующий фрейм данных:

test_df <- structure(list(system = c("A", "B", "B", "C", "D", "B", "B", 
"C", "B", "B", "A", "D", "D", "B", "E", NA, NA, "B", "A", "D"
), type = c(2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 
2L, 1L, 1L, 2L, 2L, 1L, 1L), start_date = structure(c(16567, 
16604, 16324, 16595, 16111, 17597, 16784, 16648, 16121, 16549, 
16438, 16484, 15997, 16488, 16708, 16121, 16327, 16329, 17010, 
16342), class = "Date"), end_date = structure(c(16995, 16984, 
16661, 16909, 16414, 17843, 16990, 16853, 16323, 16751, 16622, 
16665, 16154, 16624, 16839, 16251, 16456, 16456, 17134, 16458
), class = "Date"), event_duration = c(428, 380, 337, 314, 303, 
246, 206, 205, 202, 202, 184, 181, 157, 136, 131, 130, 129, 127, 
124, 116)), row.names = c(NA, -20L), class = c("tbl_df", "tbl", 
"data.frame"))
test_df
#>    system type start_date   end_date event_duration
#> 1       A    2 2015-05-12 2016-07-13            428
#> 2       B    2 2015-06-18 2016-07-02            380
#> 3       B    2 2014-09-11 2015-08-14            337
#> 4       C    2 2015-06-09 2016-04-18            314
#> 5       D    1 2014-02-10 2014-12-10            303
#> 6       B    1 2018-03-07 2018-11-08            246
#> 7       B    1 2015-12-15 2016-07-08            206
#> 8       C    2 2015-08-01 2016-02-22            205
#> 9       B    1 2014-02-20 2014-09-10            202
#> 10      B    2 2015-04-24 2015-11-12            202
#> 11      A    2 2015-01-03 2015-07-06            184
#> 12      D    2 2015-02-18 2015-08-18            181
#> 13      D    1 2013-10-19 2014-03-25            157
#> 14      B    2 2015-02-22 2015-07-08            136
#> 15      E    1 2015-09-30 2016-02-08            131
#> 16   <NA>    1 2014-02-20 2014-06-30            130
#> 17   <NA>    2 2014-09-14 2015-01-21            129
#> 18      B    2 2014-09-16 2015-01-21            127
#> 19      A    1 2016-07-28 2016-11-29            124
#> 20      D    1 2014-09-29 2015-01-23            116

Для каждого system я хотел бы построить разноцветные последовательности сегментов, для каждого type события, начиная с start_date и заканчиваяна end_date.Например, для системы A я хотел бы построить две последовательности сегментов:

  • одна, соответствующая событиям типа 1, содержащая один сегмент, который начинается в 2016-07-28 и заканчиваетсяв 2016-11-29
  • другой, соответствующий событиям типа 2, содержащий два сегмента, один из которых начинается в 2015-01-03 и заканчивается в 2015-07-06, а другой начинается в 2015-05-12 и заканчивается в 2016-07-13.Как видите, события в последовательности могут перекрываться.Я не уверен, как убедиться, что пользователь все еще может различать события: возможно, можно использовать стрелки или вертикальные черты или что-то еще, чтобы показать начало и конец события.

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

Для системы B у меня будет 3 сегмента, соответствующих событиям типа 1, 5, соответствующих событиям типа 2. И так далее.Как я могу создать сюжет, который я желаю?Я бы предпочел решение ggplot2.

1 Ответ

1 голос
/ 16 марта 2019

Один из вариантов - использовать джиттер, чтобы избежать превышения начальной и конечной точек.То, насколько хорошо это работает, будет зависеть от того, сколько сегментов вы пытаетесь построить.

Чтобы обеспечить возможность регулировки направления y линий на одинаковую величину, вы можете добавить джиттер к dfи использовать его для построения сегментов:

test_df$jitter <- jitter(test_df$type, amount = 0.25)

ggplot(test_df) + 
  geom_segment(aes(x=start_date, xend=end_date, y=jitter, yend=jitter)) + 
  facet_wrap(~system) +
  scale_y_continuous(breaks=c(1,2), labels=c(1,2)) +
  theme(panel.grid.minor.y = element_blank())

enter image description here

Вы также можете использовать индикаторы начала и конца, как вы предлагали, чтобы подчеркнуть концысегменты, но это может просто добавить больше шума, если количество сегментов велико.

ggplot(test_df) + 
  geom_point(aes(x=start_date, y=jitter), size=1) +
  geom_segment(aes(x=start_date, xend=end_date, y=jitter, yend=jitter), 
                   arrow=arrow(30,unit(1.25,"mm"),"last","closed")) + 
  facet_wrap(~system) +
  scale_y_continuous(breaks=c(1,2), labels=c(1,2)) +
  theme(panel.grid.minor.y = element_blank())

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...