本文介绍了甘特图与R的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人使用R创建






如果您的数据存储在 data.frame 中,则可以创建要传递给<$ c



请考虑以下方面:

  df  status = c ,active,crit),
pos = c(first_1,first_2,first_3),
start = c(2014-01-06 01-09,after first_2),
end = c(2014-01-08,3d,5d))

#任务状态pos start end
#1 task1 done first_1 2014-01-06 2014-01-08
#2 task2 active first_2 2014-01-09 3d
#3 task3 crit first_3 after first_2 5d

使用 dplyr tidyr (或任何您喜欢的数据争夺资源):

  dplyr)

mermaid(
paste0(
#mermaidheader,每个组件用\\\
分隔)换行符
gantt \\\

dateFormat YYYY-MM-DD,\\\

title A Very Nice Gantt Diagram,\\\

#unite the前两列(任务&状态),并用:
#将它们分开,然后,将其他列联合起来并用,分隔
#这将创建所需的美人鱼body
paste(df%> ;%
unite(i,task,status,sep =:)%>%
unite(j,i,pos,start,end,sep =,)%&
。$ j,
collapse =\\\

),\\\



正如@GeorgeDontas在注释中提到的,有一个






使用timevis



timevis






使用plotly



我偶然发现了



您可以添加其他信息和注释,自定义字体和颜色等详情)


Has anybody used R to create a Gantt chart?The only solution that I'm aware of is this, but I'm looking for something more sophisticated, if possible (looking more or less like this or this).

P.S. I could live without the dependency arrows.

解决方案

There are now a few elegant ways to generate a Gantt chart in R.

Using DiagrammeR

library(DiagrammeR)
mermaid("
gantt
dateFormat  YYYY-MM-DD
title A Very Nice Gantt Diagram

section Basic Tasks
This is completed             :done,          first_1,    2014-01-06, 2014-01-08
This is active                :active,        first_2,    2014-01-09, 3d
Do this later                 :               first_3,    after first_2, 5d
Do this after that            :               first_4,    after first_3, 5d

section Important Things
Completed, critical task      :crit, done,    import_1,   2014-01-06,24h
Also done, also critical      :crit, done,    import_2,   after import_1, 2d
Doing this important task now :crit, active,  import_3,   after import_2, 3d
Next critical task            :crit,          import_4,   after import_3, 5d

section The Extras
First extras                  :active,        extras_1,   after import_4,  3d
Second helping                :               extras_2,   after extras_1, 20h
More of the extras            :               extras_3,   after extras_1, 48h
")

Find this example and many more on DiagrammeR GitHub


If your data is stored in a data.frame, you can create the string to pass to mermaid() by converting it to the proper format.

Consider the following:

df <- data.frame(task = c("task1", "task2", "task3"),
                 status = c("done", "active", "crit"),
                 pos = c("first_1", "first_2", "first_3"),
                 start = c("2014-01-06", "2014-01-09", "after first_2"),
                 end = c("2014-01-08", "3d", "5d"))

#   task status     pos         start        end
#1 task1   done first_1    2014-01-06 2014-01-08
#2 task2 active first_2    2014-01-09         3d
#3 task3   crit first_3 after first_2         5d

Using dplyr and tidyr (or any of your favorite data wrangling ressources):

library(tidyr)
library(dplyr)

mermaid(
  paste0(
    # mermaid "header", each component separated with "\n" (line break)
    "gantt", "\n",
    "dateFormat  YYYY-MM-DD", "\n",
    "title A Very Nice Gantt Diagram", "\n",
    # unite the first two columns (task & status) and separate them with ":"
    # then, unite the other columns and separate them with ","
    # this will create the required mermaid "body"
    paste(df %>%
            unite(i, task, status, sep = ":") %>%
            unite(j, i, pos, start, end, sep = ",") %>%
            .$j,
          collapse = "\n"
    ), "\n"
  )
)

As per mentioned by @GeorgeDontas in the comments, there is a little hack that could allow to change the labels of the x axis to dates instead of 'w.01, w.02'.

Assuming you saved the above mermaid graph in m, do:

m$x$config = list(ganttConfig = list(
  axisFormatter = list(list(
    "%b %d, %Y"
    ,htmlwidgets::JS(
      'function(d){ return d.getDay() == 1 }'
    )
  ))
))

Which gives:


Using timevis

From the timevis GitHub:

library(timevis)

data <- data.frame(
  id      = 1:4,
  content = c("Item one"  , "Item two"  ,"Ranged item", "Item four"),
  start   = c("2016-01-10", "2016-01-11", "2016-01-20", "2016-02-14 15:00:00"),
  end     = c(NA          ,           NA, "2016-02-04", NA)
)

timevis(data)

Which gives:


Using plotly

I stumbled upon this post providing another method using plotly. Here's an example:

library(plotly)

df <- read.csv("https://cdn.rawgit.com/plotly/datasets/master/GanttChart-updated.csv",
               stringsAsFactors = F)

df$Start  <- as.Date(df$Start, format = "%m/%d/%Y")
client    <- "Sample Client"
cols      <- RColorBrewer::brewer.pal(length(unique(df$Resource)), name = "Set3")
df$color  <- factor(df$Resource, labels = cols)

p <- plot_ly()
for(i in 1:(nrow(df) - 1)){
  p <- add_trace(p,
                 x = c(df$Start[i], df$Start[i] + df$Duration[i]),
                 y = c(i, i),
                 mode = "lines",
                 line = list(color = df$color[i], width = 20),
                 showlegend = F,
                 hoverinfo = "text",
                 text = paste("Task: ", df$Task[i], "<br>",
                              "Duration: ", df$Duration[i], "days<br>",
                              "Resource: ", df$Resource[i]),
                 evaluate = T
  )
}

p

Which gives:

You can then add additional information and annotations, customize fonts and colors, etc. (see blog post for details)

这篇关于甘特图与R的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-02 09:01