格式化24小时时标时出现ggplot错误

时间:2019-02-21 11:13:15

标签: r datetime ggplot2

在ggplot上绘制x轴比例时出现错误。

lubridate::parse_date_time(df1$hr,"H:M") -> df1$hr

ggplot(data = df1 , aes(x = hr, y = Val, color = Date)) +geom_line() +
 scale_x_datetime(date_breaks = "1 hours", date_labels = "%H:%M")

下面是我的示例数据。

df1 <- data.table::fread("Date  hr  Val
19/02/19    0:00    1292
19/02/19    1:00    1047
19/02/19    2:00    160
19/02/19    3:00    80
19/02/19    4:00    67
19/02/19    5:00    48
19/02/19    6:00    30
19/02/19    7:00    99
19/02/19    8:00    188
19/02/19    9:00    42
19/02/19    10:00   14
19/02/19    11:00   27
19/02/19    12:00   21
19/02/19    13:00   21
19/02/19    14:00   110
19/02/19    15:00   535
19/02/19    16:00   1503
19/02/19    17:00   2626
19/02/19    18:00   4859
19/02/19    19:00   5699
19/02/19    20:00   5718
19/02/19    21:00   5337
19/02/19    22:00   6101
19/02/19    23:00   5381
20/02/19    0:00    1836
20/02/19    1:00    236
20/02/19    2:00    96
20/02/19    3:00    79
20/02/19    4:00    115
20/02/19    5:00    123
20/02/19    6:00    137
20/02/19    7:00    142
20/02/19    8:00    119
20/02/19    9:00    99
20/02/19    10:00   92
20/02/19    11:00   109
20/02/19    12:00   118
20/02/19    13:00   159
20/02/19    14:00   269
20/02/19    15:00   648
20/02/19    16:00   981
20/02/19    17:00   1371
20/02/19    18:00   1804
20/02/19    19:00   2772
20/02/19    20:00   4582
20/02/19    21:00   5346
20/02/19    22:00   5244
20/02/19    23:00   4956")

我想做的是在x轴刻度上绘制所有小时数,但低于误差

Error in as.POSIXlt.character(as.character(x), ...) :     character string 
is not in a standard unambiguous format. 

但是它适用于相同数据帧的子集。

我认为小时可以是1位数字或2位数字并且不能同时使用时

1 个答案:

答案 0 :(得分:1)

我会这样:

library(lubridate)

#get df1...

#convert hr to something more useable with...
df1$hr <- hour(hm(df1$hr))

ggplot(df1, aes(x = hr, y = Val, color = Date)) + geom_line()

Graph of Val vs Time of Day grouped by Date

,或者如果您特别希望使用"%H:%M"或类似的x轴标签时间格式:

ggplot(df1, aes(x = hr, y = Val, color = Date)) + geom_line() + scale_x_continuous(breaks = seq(0, 23, 1), labels = paste(seq(0, 23, 1), "00", sep = ":"))

Graph of Val vs Time of Day grouped by Date with x labels as hour:minute

说明:我从来没有发现处理时间和日期很容易,所以如果您可以稍微简化一下问题,那就去做吧。

在您的情况下,您只对一天中的小时感兴趣,因此多余的是分钟。要从时间中提取小时作为字符数据类型,有几种方法,但是使用lubridate,您可以使用hm(df1$hr)将{10:00“转换为"10H 0M 0S"周期数据类型,您只希望使用hour()可以计算的小时数,这将为您提供10作为数字数据类型。

因此,如果一个衬里hour(hm(df1$hr))会将“ 10:00”转换为10,则ggplot可以将“ Val”对“ hr”作为数字数据类型而不是我认为的时间或字符数据类型进行绘制是一件容易的事。