Diagramas de Gantt con R [cerrado]

Respuestas:

109

Ahora hay algunas formas elegantes de generar un diagrama de Gantt en R.

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

Encuentra este ejemplo y muchos más en DiagrammeR GitHub


Si sus datos están almacenados en a data.frame, puede crear la cadena a la que pasar mermaid()si la convierte al formato adecuado.

Considera lo siguiente:

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

Usando dplyry tidyr(o cualquiera de sus recursos favoritos de lucha de datos):

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

Según lo mencionado por @GeorgeDontas en los comentarios, hay un pequeño truco que podría permitir cambiar las etiquetas del eje x a fechas en lugar de 'w.01, w.02'.

Suponiendo que guardó el gráfico de sirena anterior m, haga lo siguiente:

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

Lo que da:

ingrese la descripción de la imagen aquí


Usando timevis

Desde timevis GitHub :

timevisle permite crear visualizaciones de línea de tiempo ricas y completamente interactivas en R. Las líneas de tiempo se pueden incluir en aplicaciones Shiny y documentos de rebajas de R, o se pueden ver desde la consola R y 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)

Lo que da:

ingrese la descripción de la imagen aquí


Usando plotly

Me encontré con esta publicación que proporciona otro método usando plotly. He aquí un ejemplo:

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

Lo que da:

ingrese la descripción de la imagen aquí

Luego, puede agregar información adicional y anotaciones, personalizar fuentes y colores, etc. (consulte la publicación del blog para obtener más detalles)

Steven Beaupré
fuente
Es realmente agradable. Sin embargo, me parece bastante difícil crear automáticamente esta cadena que se pasa a mermaid, utilizando datos almacenados en un marco de datos.
George Dontas
¿Es posible mostrar las fechas como etiquetas del eje x, en lugar de "w.01", "w.02", etc.?
George Dontas
2
Anule el diagrama de Gantt para permitir un eje de fecha personalizado en lugar de una escala de 0 a 52 semanas: github.com/rich-iannone/DiagrammeR/issues/77
George Dontas
El código funciona perfectamente usando DiagrameR y Mermaid en Rstudio, pero al usarlo en PowerBI recibí un mensaje de error: no se creó ninguna imagen. El código R no dio como resultado la creación de ningún elemento visual. Asegúrese de que su script R dé como resultado un trazado en el dispositivo predeterminado de R. Alguna idea, cualquiera, gracias Peddie
PeddiePooh
1
La solución con timevisen el Raspecto fresco y simple. :-)
Suman Khanal
29

Un ggplot2diagrama de Gantt simple .

Primero, creamos algunos datos.

library(reshape2)
library(ggplot2)

tasks <- c("Review literature", "Mung data", "Stats analysis", "Write Report")
dfr <- data.frame(
  name        = factor(tasks, levels = tasks),
  start.date  = as.Date(c("2010-08-24", "2010-10-01", "2010-11-01", "2011-02-14")),
  end.date    = as.Date(c("2010-10-31", "2010-12-14", "2011-02-28", "2011-04-30")),
  is.critical = c(TRUE, FALSE, FALSE, TRUE)
)
mdfr <- melt(dfr, measure.vars = c("start.date", "end.date"))

Ahora dibuja la trama.

ggplot(mdfr, aes(value, name, colour = is.critical)) + 
  geom_line(size = 6) +
  xlab(NULL) + 
  ylab(NULL)
Richie algodón
fuente
Solo pude crear algunos datos dos veces :-)
George Dontas
@ gd047: Eso requiere un facepalm a dos manos. La idiotez ahora arreglada.
Richie Cotton
1
Es muy agradable, pero lo que busco principalmente es una forma de mostrar más de una barra para cada tarea (como puede ver en los ejemplos que di), por ejemplo, una para la línea de base y otra para la duración real de la tarea. ¿Hay alguna forma de hacer algo como esto?
George Dontas
12

Considere usar el paqueteprojmanr (versión 0.1.0 lanzada en CRAN el 23 de agosto de 2017).

library(projmanr)

# Use raw example data
(data <- taskdata1)

taskdata1:

  id name duration pred
1  1   T1        3     
2  2   T2        4    1
3  3   T3        2    1
4  4   T4        5    2
5  5   T5        1    3
6  6   T6        2    3
7  7   T7        4 4,5 
8  8   T8        3  6,7

Ahora comience a preparar gantt:

# Create a gantt chart using the raw data
gantt(data)

ingrese la descripción de la imagen aquí

# Create a second gantt chart using the processed data
res <- critical_path(data)
gantt(res)

ingrese la descripción de la imagen aquí

# Use raw example data
data <- taskdata1
# Create a network diagram chart using the raw data
network_diagram(data)

ingrese la descripción de la imagen aquí

# Create a second network diagram using the processed data
res <- critical_path(data)
network_diagram(res)

ingrese la descripción de la imagen aquí

user2030503
fuente
7

Prueba esto:

install.packages("plotrix")
library(plotrix)
?gantt.chart
juur
fuente
5

Puede hacerlo con el paquete GoogleVis :

datTL <- data.frame(Position=c(rep("President", 3), rep("Vice", 3)),
                    Name=c("Washington", "Adams", "Jefferson",
                           "Adams", "Jefferson", "Burr"),
                    start=as.Date(x=rep(c("1789-03-29", "1797-02-03", 
                                          "1801-02-03"),2)),
                    end=as.Date(x=rep(c("1797-02-03", "1801-02-03", 
                                        "1809-02-03"),2)))

Timeline <- gvisTimeline(data=datTL, 
                         rowlabel="Name",
                         barlabel="Position",
                         start="start", 
                         end="end",
                         options=list(timeline="{groupByRowLabel:false}",
                                      backgroundColor='#ffd', 
                                      height=350,
                                      colors="['#cbb69d', '#603913', '#c69c6e']"))
plot(Timeline)

ingrese la descripción de la imagen aquí

Fuente: https://cran.r-project.org/web/packages/googleVis/vignettes/googleVis_examples.html

vonjd
fuente
4

Usé y modifiqué el ejemplo anterior de Richie, funcionó como un encanto. Versión modificada para mostrar cómo su modelo podría traducirse en la ingesta de datos CSV en lugar de elementos de texto proporcionados manualmente.

NOTA : Faltaba la respuesta de Richie, una indicación de que se necesitan 2 paquetes ( reshape y ggplot2 ) para que funcione el código anterior / siguiente.

rawschedule <- read.csv("sample.csv", header = TRUE) #modify the "sample.csv" to be the name of your file target. - Make sure you have headers of: Task, Start, Finish, Critical OR modify the below to reflect column count.
tasks <- c(t(rawschedule["Task"]))
dfr <- data.frame(
name        = factor(tasks, levels = tasks),
start.date  = c(rawschedule["Start"]),
end.date    = c(rawschedule["Finish"]),
is.critical = c(rawschedule["Critical"]))
mdfr <- melt(dfr, measure.vars = c("Start", "Finish"))


#generates the plot
ggplot(mdfr, aes(as.Date(value, "%m/%d/%Y"), name, colour = Critical)) + 
geom_line(size = 6) +
xlab("Duration") + ylab("Tasks") +
theme_bw()
iamstrained
fuente
3

Aquí hay una publicación que escribí sobre el uso de ggplot para generar algo como un diagrama de Gantt. No es muy sofisticado, pero podría darte algunas ideas.

neilfws
fuente
Gracias, eso es realmente útil
slackline
3

Para mí, Gvistimeline fue la mejor herramienta para hacer esto, pero su conexión en línea requerida no me fue útil. Por lo tanto, creé un paquete llamado vistimeque usa plotly(similar a la respuesta de @Steven Beaupré), para que pueda acercar, etc.

https://github.com/shosaco/vistime

vistime: Cree líneas de tiempo interactivas o diagramas de Gantt con plotly.js. Los gráficos se pueden incluir en aplicaciones Shiny y manipular a través de plotly_build ().

install.packages("vistime")    
library("vistime")  

dat <- data.frame(Position=c(rep("President", 3), rep("Vice", 3)),
              Name = c("Washington", "Adams", "Jefferson", "Adams", "Jefferson", "Burr"),
              start = rep(c("1789-03-29", "1797-02-03", "1801-02-03"), 2),
              end = rep(c("1797-02-03", "1801-02-03", "1809-02-03"), 2),
              color = c('#cbb69d', '#603913', '#c69c6e'),
              fontcolor = rep("white", 3))

vistime(dat, events="Position", groups="Name", title="Presidents of the USA")

ingrese la descripción de la imagen aquí

shosaco
fuente
3

Pregunta muy antigua, lo sé, pero quizás valga la pena dejarla aquí que, insatisfecho con las respuestas que encontré a esta pregunta, hace unos meses hice un paquete básico para hacer diagramas de Gantt basados ​​en ggplot2 : ganttrify (más detalles en el archivo Léame del paquete) .

Salida de ejemplo: ingrese la descripción de la imagen aquí

giocomai
fuente
2

Library PlotPrjNetworks proporciona útiles herramientas de red para la gestión de proyectos.

library(PlotPrjNetworks)
project1=data.frame(
task=c("Market Research","Concept Development","Viability Test",
"Preliminary Design","Process Design","Prototyping","Market Testing","Final Design",
"Launching"),
start=c("2015-07-05","2015-07-05","2015-08-05","2015-10-05","2015-10-05","2016-02-18",
"2016-03-18","2016-05-18","2016-07-18"),
end=c("2015-08-05","2015-08-05","2015-10-05","2016-01-05","2016-02-18","2016-03-18",
"2016-05-18","2016-07-18","2016-09-18"))
project2=data.frame(
from=c(1,2,3,4,5,6,7,8),
to=c(2,3,4,5,6,7,8,9),
type=c("SS","FS","FS","SS","FS","FS","FS","FS"),
delay=c(7,7,7,8,10,10,10,10))
GanttChart(project1,project2)

ingrese la descripción de la imagen aquí

George Dontas
fuente
Gracias @George por esto, ¿hay alguna manera de usar el nombre de las tareas desde y hacia? ¿Debo publicarlo como una nueva pregunta? Basado en doc github.com/cran/PlotPrjNetworks/blob/master/R/PlotPrjNetworks.R de y debe ser un número entero, ¿hay una solución rápida para esto?
Mohsen Sichani
1

Me gustaría mejorar ggplot-Answer con varias barras para cada tarea.

Primero genere algunos datos (dfrP es el data.frame de la otra respuesta, dfrR es algún otro data.frame con fechas de realización y mdfr es una combinación que se ajusta a la siguiente declaración ggplot ()):

library(reshape2)
tasks <- c("Review literature", "Mung data", "Stats analysis", "Write Report")
dfrP <- data.frame(
  name        = factor(tasks, levels = tasks),
  start.date  = as.Date(c("2010-08-24", "2010-10-01", "2010-11-01", "2011-02-14")),
  end.date    = as.Date(c("2010-10-31", "2010-12-14", "2011-02-28", "2011-04-30")),
  is.critical = c(TRUE, FALSE, FALSE, TRUE)
)
dfrR <- data.frame(
  name        = factor(tasks, levels = tasks),
  start.date  = as.Date(c("2010-08-22", "2010-10-10", "2010-11-01", NA)),
  end.date    = as.Date(c("2010-11-03", "2010-12-22", "2011-02-24", NA)),
  is.critical = c(TRUE, FALSE, FALSE,TRUE)
)
mdfr <- merge(data.frame(type="Plan", melt(dfrP, measure.vars = c("start.date", "end.date"))),
  data.frame(type="Real", melt(dfrR, measure.vars = c("start.date", "end.date"))), all=T)

Ahora grafique estos datos usando facetas para el nombre de la tarea:

library(ggplot2)
ggplot(mdfr, aes(x=value, y=type, color=is.critical))+
  geom_line(size=6)+
  facet_grid(name ~ .) +
  scale_y_discrete(limits=c("Real", "Plan")) +
  xlab(NULL) + ylab(NULL)

Sin is.critical-information, también podría usar Plan / Real como color (que preferiría), pero quería usar el data.frame de la otra respuesta para hacerlo mejor comparable.

Thomas Runge
fuente
1

Encontré que geom_segment en ggplot es genial. De las soluciones anteriores utilice los datos pero no es necesario fundirlos.

library(ggplot2)

tasks <- c("Review literature", "Mung data", "Stats analysis", "Write Report")
dfr <- data.frame(
  name        = factor(tasks, levels = tasks),
  start.date  = as.Date(c("2010-08-24", "2010-10-01", "2010-11-01", "2011-02-14")),
  end.date    = as.Date(c("2010-10-31", "2010-12-14", "2011-02-28", "2011-04-30")),
  is.critical = c(TRUE, FALSE, FALSE, TRUE)
)

ggplot(dfr, aes(x =start.date, xend= end.date, y=name, yend = name, color=is.critical)) +
  geom_segment(size = 6) +
  xlab(NULL) + ylab(NULL)

GantPlot

Kbushu
fuente