ggplot:如何从日期时间中提取一天中的时间并仍然获得日期类型?

ggplot: how to extract the time of the day from a datetime and still get a date type?

考虑以下示例

data <- data_frame(time = c(ymd_hms('20160201 08:10:53'),
                            ymd_hms('20160202 08:10:53'),
                            ymd_hms('20160203 08:10:54'),
                            ymd_hms('20160204 08:10:54'),
                            ymd_hms('20160205 08:10:55')),
                   value = c(1,1,1,2,2))

> data
# A tibble: 5 × 2
                 time value
               <dttm> <dbl>
1 2016-02-01 03:10:53     1
2 2016-02-02 03:10:53     1
3 2016-02-03 03:10:54     1
4 2016-02-04 03:10:54     2
5 2016-02-05 03:10:55     2

我想聚合此数据框,以便在我的数据中的所有日期的给定小时-分钟-秒内获得 value 的平均值。

也就是说,我可以

> data %>%  group_by(time_agg = paste(hour(time), minute(time), second(time))) %>% 
+   summarise(mean = mean(value))
# A tibble: 3 × 2
  time_agg  mean
     <chr> <dbl>
1  3 10 53   1.0
2  3 10 54   1.5
3  3 10 55   2.0

这是我的问题:

我需要绘制此数据(x 轴 = 时间,y = 平均值)但 time_agg 是一个字符!有没有办法让 R (ggplot) 理解这些时间?

您可以创建一个基于 hms 的数字列作为 x 轴中断,另一列格式为 %H:%M:%S 作为标签以手动方式绘制它。直接用difftime作为x轴is difficult:

library(dplyr)
library(ggplot2)
df <- df %>% group_by(labels = strftime(time, "%H:%M:%S"), 
                      hours = as.numeric(as.difftime(labels))) %>% 
             summarise(mean = mean(value))
df
#Source: local data frame [3 x 3]
#Groups: labels [?]

#    labels    hours  mean
#     <chr>    <dbl> <dbl>
#1 03:10:53 3.181389   1.0
#2 03:10:54 3.181667   1.5
#3 03:10:55 3.181944   2.0

ggplot(df, aes(x = hours, y = mean)) + geom_point(size = 3) + 
   scale_x_continuous(breaks = df$hours, labels = df$labels, name = "time")