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

时间:2017-01-04 00:55:40

标签: r datetime ggplot2 lubridate

考虑以下示例

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)了解这些是几个小时?

1 个答案:

答案 0 :(得分:1)

您可以根据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")

enter image description here