ggplot:在多个日期绘制时间

时间:2016-12-30 18:24:21

标签: r date datetime ggplot2

我想绘制一个折线图,x轴时间(hh:mm)(这是一个特定的时间间隔), 和y轴平均价格。

我希望图表显示多行(每天一行)。

目前我的数据框是这样的(我还有其他一些变量,但我没有在我的图中使用它们。相关的数据如下):

AV.PRICE DATE        TIME
180      2014-01-20  13H 0M 0S
179      2014-01-20  13H 1M 0S
175      2014-01-20  13H 2M 0S
179      2014-01-20  13H 3M 0S

......等等,日期会继续,但时间只会在每天13:00到15:00之间取值

DATE类是日期,AV.PRICE是num,TIME是句点(使用lubridate)

如果我的问题不清楚,这就是我正在寻找的,在仅时间轴上绘制与日期无关的图形,除了我在r中使用ggplot2:plotting data for different days on a single HH:MM:SS axis

EDITED


当我尝试用ggplot绘制原始df时,它无法识别时间变量。 ggplot(df, aes(x=TIME, y=AV.PRICE, group = DATE)) + geom_line()提供error: cannot compare Period to Duration

dput

structure(list(AV.PRICE = c(178.841368677043, 178.837478586724, 
178.811640304183, 178.8395125, 178.858236768802, 178.860812464589
), DATE = structure(c(16098, 16098, 16098, 16098, 16098, 16098
), class = "Date"), TIME = structure(c(0, 0, 0, 0, 0, 0), year = c(0, 
0, 0, 0, 0, 0), month = c(0, 0, 0, 0, 0, 0), day = c(0, 0, 0, 
0, 0, 0), hour = c(13, 13, 13, 13, 13, 13), minute = c(0, 1, 
2, 3, 4, 5), class = structure("Period", package = "lubridate"))), .Names = c("AV.PRICE", 
"DATE", "TIME"), row.names = c(NA, 6L), class = "data.frame")

1 个答案:

答案 0 :(得分:3)

我认为你的问题在于df$TIME class =“Period”而不是时间。所有你需要做的就是把它强制回POSIXt。

df <- data.table::fread("AV.PRICE DATE        TIME
180      2014-01-20  13H0M0S
179      2014-01-20  13H1M0S
175      2014-01-20  13H2M0S
179      2014-01-20  13H3M0S
182      2014-01-21  13H0M0S
181      2014-01-21  13H1M0S
177      2014-01-21  13H2M0S
181      2014-01-21  13H3M0S")

为了显示目的,我为Date添加了一个额外的值AV.PRICE。抱歉,我无法正常加载您的dput,或者我会从那里开始。另外fread不喜欢输入中的空格,但您可以在实际的df $ TIME列中使用collapseas.character之类的内容。

df$TIME %<>% lubridate::parse_date_time("HMS") # make it class = "POSIXt

ggplot(data = df, aes(x = TIME, y = AV.PRICE, color = DATE)) +
    geom_line() 

enter image description here

如果你愿意,也可以使用+ scale_x_time(),但默认情况下它会呈现你想要的输出。