Как установить дневные ограничения по оси с помощью facet_wrap (~ day) в ggplot2 - PullRequest
1 голос
/ 05 февраля 2020

Я пытаюсь построить для каждого дня эти точки, и я бы хотел, чтобы каждая ось фасета расширялась с «00:00» до «23:59».

Сейчас это выглядит так, с каждой осью x фасета, простирающейся от первого вхождения до последнего, но я бы хотел, чтобы каждая ось x фасета начиналась в "00:00" и заканчивалась в "23:59" в день фасета:

ggplot(minidate, aes(x=time,y=measurement, group=EPC))+
  geom_point()+ geom_line()+
  facet_wrap(~dateonly,ncol=1)

enter image description here

Я попытался указать c раз, используя ограничения в scale_x_time, но это не работает. Я надеялся, что facet_wrap работает как group_by от tidyr, поэтому я попробовал это

+ scale_x_datetime(limits=
                     c(as.POSIXct(paste0(unique(minidate$dateonly),"00:00"),format="%Y-%m-%d %H:%M"),
                       as.POSIXct(paste0(unique(minidate$dateonly),"23:59"),format="%Y-%m-%d %H:%M"))
  )

, но, похоже, он не работает.

Ошибка в zero_range (диапазон) : x должен иметь длину 1 или 2

Вот набор данных:

dput()

структура (список (время = структура (c (1523883481, 1523883481, 1523883957, 1523883957, 1524059523, 1524059523, 1524059913, 1524059913, 1524138446, 1524138446, 1524138488, 1524138488, 1524139045, 1524139045, 1524139241, 1524139241, 1524139855, 1524139855, 1524139978, 1524139978, 1524215195, 1524215195, 1524215406, 1524215406, 1524230989, 1524230989, 1524231221, 1524231221, 1524309944, 1524309944, 1524310193, 1524310193, 1524323456, 1524323456, 1524324053, 1524324053, 1524385173, 1524385173, 1524385310, 1524385310, 1524403469, 152440, 15404040 15 15404040, 15404040, 15404040, 1540, 1540, 1540, 1540, 1541, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 15, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 158, 1540%, 1524403240 1034 * ("POSIXct", "POSIXt"), tzone = "UT C"), EP C = c ("ccd10081", "ccd10081", "ccd10081", «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 " «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», «ccd10081», "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 "," ccd10081 "), измерение = c (" в "," " out "," out "," in "," in "," out "," out "," in "," in "," out "," out "," in "," in "," out " , "out", "in", "in", "out", "out", "in", "in", "in", "out", "in", "in", "in", "out", " out "," in "," in "," out "," out "," in "," in "," out "," out "," in "," in "," out "," out " , "in", "in", "out", "out", "in", "in", "out", "out", "in", "in", "out"), dateonly = structure ( c (17637, 17637, 17637, 17637, 17639, 17639, 17639, 17639, 176 40, 17640, 17640, 17640, 17640, 17640, 17640, 17640, 17640, 17640, 17640, 17640, 17641, 17641, 17641, 17641, 17641, 17641, 17641, 17641, 17642, 17642, 17642, 17642, 17642, 17642, 17642, 17642, 17643, 17643, 17643, 17643, 17643, 17643, 17643, 17643, 17643, 17643, 17643, 17643, 17644, 17644), класс = "Дата")), row.names = c (1л, 146л, 2л, 147л, 3л, 148л, 4л, 149л, 5л, 150л, 6л, 151л, 7л, 152л, 8л, 153л, 9л, 154л, 10л, 155л, 11л, 156л, 12л, 157л, 13л , 158л, 14л, 159л, 15л, 160л, 16л, 161л, 17л, 162л, 18л, 163л, 19л, 164л, 20л, 165л, 21л, 166л, 22л, 167л, 23л, 168л, 24л, 169л, 25л, 170л ), class = "data.frame")

Как установить дневные ограничения по времени при использовании facet_wrap(~day)?

1 Ответ

3 голосов
/ 05 февраля 2020

Один из подходов состоит в том, чтобы создать вспомогательный столбец даты и времени для отображения, где все время в один и тот же день. Преимущество этого состоит в том, что он использует преимущества разрывов и маркировки ggplot для дат:

library(dplyr); library(lubridate); library(stringr)
minidate %>%
  mutate(time_only = ymd_hms(paste("1900-01-01", 
                             str_sub(time, 12)))) %>%
ggplot(aes(x=time_only,y=measurement, group=EPC))+
  geom_point()+ geom_line()+
  expand_limits(x = c(ymd_h(1900010100), ymd_h(1900010200))) +
  scale_x_datetime(date_labels = "%H:%M") +
  facet_wrap(~dateonly,ncol=1)

enter image description here

Или вы можете преобразовать даты в десятичное число значение, представляющее час дня:

library(dplyr); library(lubridate)
minidate %>%
  mutate(time_dec = hour(time) + minute(time)/60 + second(time)/3600) %>%
ggplot(aes(x=time_dec,y=measurement, group=EPC))+
  geom_point()+ geom_line()+
  expand_limits(x = c(0, 24)) +
  facet_wrap(~dateonly,ncol=1)

enter image description here

...