как создать растровый график, отображающий непрерывные промежутки времени для поведения (без галочки) - PullRequest
1 голос
/ 25 мая 2020

Мне нужно создать растровый график, который отображает временные данные. Вот пример имеющихся у меня данных. Для каждого участника у меня есть продолжительность времени (начало и смещение), которое он провел в разных местах (детская кроватка, пол и т. Д. c) в течение 24 часов в сутки. Я хотел бы такой тип растра, который показывает местоположение участников непрерывно, а не в виде галочки. Как мне go написать этот скрипт в ggplot2?

id  onset       offset     location
1   06:00:00.0  06:35:00.0  hichair
1   06:35:00.0  08:00:00.0  carseat
1   08:00:00.0  09:00:00.0  chifurn
1   09:00:00.0  09:45:00.0  cribcradle
1   09:45:00.0  12:00:00.0  gndfl
1   12:00:00.0  12:45:00.0  chifurn
1   12:45:00.0  15:00:00.0  gndfl
1   15:00:00.0  16:00:00.0  chifurn
1   16:00:00.0  17:15:00.0  strowlkr
1   17:15:00.0  18:00:00.0  carseat
1   18:00:00.0  18:30:00.0  hichair
1   18:30:00.0  19:30:00.0  gndfl
1   19:30:00.0  20:00:00.0  adlfurn
1   20:00:00.0  06:00:00.0  cribcradle
2   06:00:00.0  06:30:00.0  cribcradle
2   06:30:00.0  06:45:00.0  adlfurn
2   06:45:00.0  06:55:00.0  adlfurn
2   06:55:00.0  07:45:00.0  gndfl
2   07:45:00.0  07:55:00.0  arms
2   07:55:00.0  08:30:00.0  gndfl
2   08:30:00.0  08:50:00.0  hichair
2   08:50:00.0  09:45:00.0  strowlkr
2   09:45:00.0  10:00:00.0  cribcradle
2   10:00:00.0  11:00:00.0  cribcradle
2   11:00:00.0  11:05:00.0  cribcradle
2   11:05:00.0  11:15:00.0  hichair
2   11:15:00.0  11:35:00.0  infcarry
2   11:35:00.0  12:30:00.0  gndfl
2   12:30:00.0  13:00:00.0  hichair
2   13:00:00.0  13:30:00.0  gndfl
2   13:30:00.0  15:15:00.0  cribcradle
2   15:15:00.0  16:20:00.0  carseat
2   16:20:00.0  18:30:00.0  arms
2   18:30:00.0  18:45:00.0  infcarry
2   18:45:00.0  19:45:00.0  carseat
2   19:45:00.0  20:05:00.0  arms
2   20:05:00.0  06:00:00.0  cribcradle
3   06:00:00.0  07:00:00.0  adlfurn
3   07:00:00.0  07:05:00.0  adlfurn
3   07:05:00.0  07:45:00.0  arms
3   07:45:00.0  08:00:00.0  gndfl
3   08:00:00.0  08:15:00.0  hichair
3   08:15:00.0  08:30:00.0  adlfurn
3   08:30:00.0  08:45:00.0  strowlkr
3   08:45:00.0  09:00:00.0  arms
3   09:00:00.0  11:30:00.0  gndfl
3   11:30:00.0  12:30:00.0  hichair
3   12:30:00.0  15:00:00.0  cribcradle
3   15:00:00.0  15:25:00.0  hichair
3   15:25:00.0  17:00:00.0  gndfl
3   17:00:00.0  17:15:00.0  carseat
3   17:15:00.0  17:30:00.0  hichair
3   17:30:00.0  17:45:00.0  gndfl
3   17:45:00.0  18:05:00.0  carseat
3   18:05:00.0  18:25:00.0  arms
3   18:25:00.0  18:40:00.0  carseat
3   18:40:00.0  19:10:00.0  gndfl
3   19:10:00.0  19:25:00.0  hichair
3   19:25:00.0  19:45:00.0  carseat
3   19:45:00.0  19:50:00.0  arms
3   19:50:00.0  19:55:00.0  adlfurn
3   19:55:00.0  20:05:00.0  arms
3   20:05:00.0  20:10:00.0  adlfurn
3   20:10:00.0  20:15:00.0  arms
3   20:15:00.0  20:20:00.0  adlfurn
3   20:20:00.0  20:25:00.0  arms
3   20:25:00.0  03:30:00.0  cribcradle
3   03:30:00.0  04:00:00.0  arms
3   04:00:00.0  06:00:00.0  adlfurn

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

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

Спасибо за вашу помощь !!

ggplot(loc_us) +
  geom_raster(aes(x=onset, y=id, fill = location)) +
  coord_equal() + theme_classic() +
  theme(legend.position="bottom") +
  scale_x_discrete(breaks=c("00:00:00.0", "06:00:00.0", "12:00:00.0", "20:00:00.0"))

фотография вывода, которую дает мне мой скрипт

1 Ответ

0 голосов
/ 25 мая 2020

Преобразуя onset и offset в datetime, этого можно достичь с помощью geom_rect. Сложная часть - это преобразование в datetime и установка правильных дат. Для преобразования datetime я сначала конвертирую в периоды, используя lubridate::hms, а затем в datetime через lubridate::as_datetime. Во-вторых, поскольку преобразование даты и времени добавляет 1 января 1970 года в качестве даты, мы должны исправить даты на втором этапе, то есть добавить один день ко времени между 00:00:00 и 06:00:00 или если offset время> onset время .

library(ggplot2)
library(dplyr)

loc_us %>% 
  mutate(
    # convert to datetime
    onset = lubridate::as_datetime(lubridate::hms(onset)), 
    offset = lubridate::as_datetime(lubridate::hms(offset)),
    # set correct dates
    onset = case_when(
      onset < lubridate::as_datetime(lubridate::hms("06:00:00")) ~ onset  + lubridate::days(1),
      TRUE ~ onset),
    offset = case_when(
      offset < onset ~ offset + lubridate::days(1),
      TRUE ~ offset)
    ) %>% 
  ggplot() +
  geom_rect(aes(xmin=onset, xmax = offset, ymin=id-.4, ymax = id + .4, fill = location), color = "white") +
  scale_x_datetime(date_labels = "%H:%M") +
  theme_classic() +
  theme(legend.position="bottom")

Создано 25.05.2020 с помощью пакета . (v0.3.0)

...