在时间轴上设置间隔之间的间隔

时间:2018-05-28 14:07:22

标签: r ggplot2 lubridate

首先让我们创建一些示例数据。时间是使用lubridate的{​​{1}}存储的,因为这似乎是最合适的。

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

3 个答案:

答案 0 :(得分:2)

你得到的错误信息,处理方法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,然后转换为日期时间对象。如果您实际上不需要约会,我使用的日期并不重要;它基本上是一个用于创建所需对象的假人。

您还需要scale_x_datetime而不是scale_x_date。如果不设置date_labels参数,您将拥有&#34; 2018-05-28 09:00:00&#34;等标签,因此您可以通过向date_labels提供格式字符串来格式化这些标签。< / p>

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")

reprex package(v0.2.0)创建于2018-05-28。

答案 1 :(得分:1)

一种方法是将Period对象转换为POSIXct,然后允许您使用scale_x_datetimedate_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")

答案 2 :(得分:1)

使用包 breaks_width() 中的新 scales 函数。

ggplot(data, aes(Time, Value)) +
  geom_point() +
  scale_x_time(breaks = scales::breaks_width("30 min"))