【问题标题】:ggplot: plotting against time on multiple datesggplot:在多个日期上绘制时间
【发布时间】:2023-03-17 19:25:01
【问题描述】:

我想用 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

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

输入

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")

【问题讨论】:

  • 你的数据好像已经是长格式了,你想怎么处理melt
  • 当我尝试用 ggplot 绘制原始 df 时,它无法识别时间变量。 ggplot(df, aes(x=TIME, y=AV.PRICE, group = DATE)) + geom_line() 给出错误:无法将 Period 与 Duration 进行比较:
  • 也许您可以在您的问题中发布dput(df),看看是否有人可以帮助您。
  • 一个完全可重现的例子会更好。
  • 如果我可能会问,我的示例中缺少什么?我有一个数据样本,我指定了变量的类,我提供了我尝试过的代码和错误消息。您还需要其他信息吗?

标签: r date datetime ggplot2


【解决方案1】:

我认为您的问题在于拥有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() 

如果您愿意,您也可以使用+ scale_x_time(),但默认看起来它正在呈现您想要的输出。

【讨论】:

  • 感谢您的提示,我最终使用了 parse_date_time2 ,因为有些无法解析并且必须首先将 TIME 强制转换为字符。而且所有的日子最终都是01-01-0000 ..所以这种工作: df$TIME
猜你喜欢
  • 2020-12-14
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
相关资源
最近更新 更多