Установить интервал между перерывами по оси времени - PullRequest
0 голосов
/ 28 мая 2018

Сначала давайте создадим пример данных.Время сохраняется с использованием lubridate hm, так как это кажется наиболее подходящим.

library(tibble)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date

(
  data <- tibble(
    Time = hm('09:00', '10:30'),
    Value = 1
  )
)
#> # A tibble: 2 x 2
#>   Time         Value
#>   <S4: Period> <dbl>
#> 1 9H 0M 0S         1
#> 2 10H 30M 0S       1

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

library(ggplot2)
library(scales)

ggplot(data, aes(Time, Value)) +
  geom_point() +
  scale_x_time(breaks = hm('09:00', '09:30', '10:00', '10:30'))

Я хотел бы создать эти перерывы автоматически с получасовыми интервалами. При попытке использования scales::date_breaks выдается ошибка.

ggplot(data, aes(Time, Value)) +
  geom_point() +
  scale_x_time(breaks = date_breaks('30 mins'))
#> Error in UseMethod("fullseq"): no applicable method for 'fullseq' applied to an object of class "c('hms', 'difftime')"

При попытке создания разрывов с помощью seq также выдается ошибка.

seq(hm('09:00'), hm('10:30'), hm('00:30'))
#> Note: method with signature 'Period#ANY' chosen for function '-',
#>  target signature 'Period#Period'.
#>  "ANY#Period" would also be valid
#> estimate only: convert to intervals for accuracy
#> Error in if (sum(values - trunc(values))) {: argument is not interpretable as logical

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Полученное вами сообщение об ошибке, касающееся метода applied to an object of class "c('hms', 'difftime')", должно дать вам подсказку, что здесь есть проблема с классом.Первое, что нужно сделать, это проверить класс вашего времени и документы (?hm), которые покажут вам, что hm фактически возвращает объект периода, а не дату и время.

library(tidyverse)
library(lubridate)

class(data$Time)
#> [1] "Period"
#> attr(,"package")
#> [1] "lubridate"

Так что вам нужно изменить Time на Date или подобный объект.Есть разные способы сделать это, но я просто быстро вставил сегодняшнюю дату и Time вместе, затем преобразовал в объект datetime.Дата, которую я использовал, не имеет значения, если вам на самом деле не нужна дата;в основном это пустышка для создания нужного вам объекта.

Вы также хотите scale_x_datetime вместо scale_x_date.Без установки аргумента date_labels у вас будут метки типа "2018-05-28 09:00:00", поэтому вы можете отформатировать их как просто раз, задав строку форматирования date_labels.

data %>%
  mutate(time2 = paste(today(), Time) %>% as_datetime()) %>%
  ggplot(aes(time2, Value)) +
  geom_point() +
  scale_x_datetime(breaks = scales::date_breaks("30 mins"), date_labels = "%H:%M")

Создано в 2018-05-28 пакетом Представить (v0.2.0).

0 голосов
/ 28 мая 2018

Один из подходов заключается в преобразовании объекта Period в POSIXct, который затем позволяет использовать scale_x_datetime и аргумент date_breaks, например

data %>%
  mutate(Time = as.POSIXct(Time, origin = "2018-01-01", tz = "GMT")) %>%
  ggplot(aes(Time, Value)) +
  geom_point() +
  scale_x_datetime(date_breaks = "30 min", date_labels = "%H:%M")
...