2010-08-23 75 views

Respuesta

62

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

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

enter image description here

Encuentra este ejemplo y muchos más en DiagrammeRGitHub


Si sus datos se almacenan en un data.frame, puede crear la cadena para pasarla al mermaid() convirtiéndola al formato adecuado.

considerar 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 dplyr y tidyr (o cualquiera de sus datos favoritos Recursos reúnes):

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 mencionado por @GeorgeDontas en los comentarios, hay una little hack que podría permitir cambiar las etiquetas del eje x a las fechas en lugar de 'w.01, w.02'.

Suponiendo que salvaron el gráfico anterior sirena en m, hacer:

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

que da:

enter image description here


Usando timevis

De la timevisGitHub:

timevis le permite crear ricos y totalmente interactivos línea de tiempo visualizaciones en R. Los plazos pueden ser incluidos en aplicaciones brillantes y R documentos de rebajas, o verse desde la consola de R y rstudio Visor.

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) 

que da:

enter image description here


Usando argumentalmente

me encontré con este post proporcionar otro método utilizando 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 

cual da:

enter image description here

A continuación, puede añadir información y anotaciones adicionales, personalizar las fuentes y colores, etc. (ver entrada de blog para más detalles)

+0

Es realmente agradable. Sin embargo, me parece bastante difícil crear automáticamente esta cadena que se pasa a la sirena, utilizando datos almacenados en un marco de datos. –

+0

¿Es posible mostrar las fechas como etiquetas de eje x, en lugar de "w.01", "w.02", etc.? –

+0

@GeorgeDontas En realidad es bastante fácil, mira la actualización. –

4

Here's a post que escribí sobre el uso de ggplot para generar algo así como un diagrama de Gantt. No es muy sofisticado, pero podría darte algunas ideas.

+0

Gracias, eso es realmente útil – slackline

26

Un simple ggplot2 diagrama de Gantt.

En primer lugar, 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 dibuje la trama.

ggplot(mdfr, aes(value, name, colour = is.critical)) + 
    geom_line(size = 6) + 
    xlab(NULL) + 
    ylab(NULL) 
+0

sólo podía crear algunos datos dos veces :-) –

+0

@ gd047: Eso exige un facepalm a dos manos. Idiocia ahora arreglada. –

+1

Es muy bueno, pero lo que más busco es una forma de mostrar más de un compás para cada tarea (como puede ver en los ejemplos que brindé), p. uno para la línea de base y otro para la duración real de la tarea. ¿Hay alguna manera de hacer algo como esto? –

7

Prueba esto:

install.packages("plotrix") 
library(plotrix) 
?gantt.chart 
6

paquete plan apoya la creación de gráficos de Gantt y burndown diagramas y contiene una función plot.gantt. Ver this R Graphical Manual page

Vea también cómo hacer uno en R usando Plotly's R API GANTT CHARTS IN R USING PLOTLY.

+0

Esto funciona bastante bien y es fácil de adaptar. He escrito una pequeña función para agregar eventos que se extienden a lo largo del tiempo: https://gist.github.com/crsh/4f9ce67f408611bc3974 – crsh

3

Utilicé y modifiqué el ejemplo anterior de Richie, funcionó como un amuleto. 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: La respuesta de Richie faltaba indicación de que 2 paquetes (remodelar y ggplot2) son necesarios para la encima/debajo de código funcione.

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() 
1

La biblioteca 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) 

enter image description here

5

Puede hacerlo con la GoogleVis package:

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) 

enter image description here

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

1

me gustaría mejorar la ggplot-respuesta con varios barras para cada tarea.

Primera generar algunos datos (DFRP es la hoja.de.datos de la otra respuesta, dfrR alguna otra hoja.de.datos con las fechas de realización y el MDFR es una fusión ajustada a la siguiente ggplot() - declaración):

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 trazar estos datos utilizando 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 la is.critical-información también se puede utilizar el plan/real como el color (que yo prefere), pero quería utilizar el data.frame de la otra respuesta para que sea mejor comparable.

0

Para mí, Gvistimeline era la mejor herramienta para hacer esto, pero su conexión en línea requerida no fue útil para mí. Así que he creado un paquete Calles vistime que utiliza plotly (similar a la respuesta de @Steven Beaupré), por lo que puede hacer un zoom etc .:

https://github.com/shosaco/vistime

vistime: Crear líneas de tiempo interactivas o diagramas de Gantt utilizando argumentalmente .js. Los gráficos pueden incluirse en aplicaciones Brillantes y manipularse a través de plotly_build().

install.packages("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") 

enter image description here

4

tener en cuenta para utilizar el package projmanr (versión 0.1.0 publicada el CRAN, el 23 ago 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 empiezan a preparar Gantt:

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

Cuestiones relacionadas