Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gantt charts with R [closed]

Has anybody used R to create a Gantt chart? I'm looking for something sophisticated, if possible (looking more or less like this).

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

like image 577
George Dontas Avatar asked Aug 23 '10 18:08

George Dontas


People also ask

Why do Gantt charts not work?

Within a modern management or small business environment, Gantt charts don't work for a number of reasons: They show a level of certainty that is based on experience at best, and complete guesswork at worst.

Why Gantt charts are not the future?

The execution dates on a Gantt chart are likely to be different in reality. It's common not to know all dependencies at the start of a project, time estimates might be based on unknowns, or the scope changes as you go. But Gantt charts work best when all dependencies are known and planned.

Is Gantt chart outdated?

For this reason, Gantt charts are frequently outdated and hinder effective team communication. Gantt charts often mean expensive software. If you buy project management software and only use it to make Gantt charts, you could save a lot of time and money by exploring Gantt chart alternatives.


1 Answers

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

Using Candela

library(candela)  data <- list(     list(name='Do this', level=1, start=0, end=5),     list(name='This part 1', level=2, start=0, end=3),     list(name='This part 2', level=2, start=3, end=5),     list(name='Then that', level=1, start=5, end=15),     list(name='That part 1', level=2, start=5, end=10),     list(name='That part 2', level=2, start=10, end=15))  candela('GanttChart',     data=data, label='name',     start='start', end='end', level='level',     width=700, height=200) 

enter image description here

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

enter image description here

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:

enter image description here


Using timevis

From the timevis GitHub:

timevis lets you create rich and fully interactive timeline visualizations in R. Timelines can be included in Shiny apps and R markdown documents, or viewed from the R console and RStudio Viewer.

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:

enter image description here


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:

enter image description here

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

like image 79
Steven Beaupré Avatar answered Sep 28 '22 02:09

Steven Beaupré