Ошибка ggplot при форматировании 24-часовой шкалы времени - PullRequest
0 голосов
/ 21 февраля 2019

Я получаю ошибку при построении шкалы оси x на ggplot.

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 или две цифры, а не оба одновременно

1 Ответ

0 голосов
/ 21 февраля 2019

Я бы сделал это следующим образом:

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» как числовые типы данных вместо временных или символьных типов данных, что я считаю более легкой задачей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...