【问题标题】:Drawing Gantt charts with R to sub-second accuracy绘制具有 R 到亚秒精度的甘特图
【发布时间】:2013-08-07 11:29:20
【问题描述】:

有点奇怪的要求,我知道,但请耐心等待。

我有一个 Excel 电子表格,其中包含一些从高度并行化的服务器端代码中获取的一些日志数据。我正在尝试分析日志中可能存在间隙的位置,指示应该记录但不记录的任务;但是因为它是一个包含十几个并行线程的串行时间戳顺序列表,所以很难阅读。所以我有了使用甘特图来可视化重叠任务的非正统想法。 Excel 在这方面很糟糕,所以我开始寻找替代工具,并考虑尝试 R。

日志中的每个任务都有一个开始时间戳、结束时间戳和一个持续时间,所以我有我需要的数据。我阅读了this SO post 并将示例分解为这个 R 脚本:

tasks <- c("Task1", "Task2")
dfr <- data.frame(
  name        = factor(tasks, levels = tasks),
  start.date  = c("07/08/2013 09:03:25.815", "07/08/2013 09:03:25.956"),
  end.date    = c("07/08/2013 09:03:28.300", "07/08/2013 09:03:30.409"),
  is.critical = c(TRUE, TRUE)
)

mdfr <- melt(dfr, measure.vars = c("start.date", "end.date"))

ggplot(mdfr, aes(as.Date(value, "%d/%m/%Y %H:%M:%OS"), name, colour = is.critical)) + 
  geom_line(size = 6) +
  xlab("") + ylab("") +
  theme_bw()

不过,这不起作用——它没有绘制任何数据,而且时间轴全乱了。我怀疑(毫不奇怪)绘制亚秒级甘特图是一件很奇怪的事情。我是一个完整的 R 新手(尽管我一直在寻找一个尝试的借口)——有什么简单的方法可以让这项工作发挥作用吗?

【问题讨论】:

    标签: r charts ggplot2 gantt-chart


    【解决方案1】:

    首先,您的时间应该是POSIXct 格式而不是Date,因为它还包含小时和分钟。您可以使用正确的格式将新列添加到融化的数据框中。

    mdfr$time&lt;-as.POSIXct(strptime(mdfr$value, "%d/%m/%Y %H:%M:%OS"))

    然后使用scale_x_datetime(),您可以控制中断在轴上的位置。对于 x 值,请使用格式正确的新列。

    library(scales)
    ggplot(mdfr, aes(time,name, colour = is.critical)) + 
      geom_line(size = 6) +
      xlab("") + ylab("") +
      theme_bw()+
      scale_x_datetime(breaks=date_breaks("2 sec"))
    

    【讨论】:

    • 像魅力一样工作!谢谢!现在来解决从 CSV 中获取数据的问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多