Diagrammes de Gantt avec R

Réponses:

104

Il existe maintenant quelques méthodes élégantes pour générer un diagramme de Gantt dans R.

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

entrez la description de l'image ici

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

entrez la description de l'image ici

Trouvez cet exemple et bien d'autres sur DiagrammeR GitHub


Si vos données sont stockées dans un data.frame, vous pouvez créer la chaîne à transmettre mermaid()en la convertissant au format approprié.

Considérer ce qui suit:

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

Utilisation dplyret tidyr(ou l'une de vos ressources de gestion de données préférées):

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

Comme mentionné par @GeorgeDontas dans les commentaires, il existe un petit hack qui pourrait permettre de changer les étiquettes de l'axe x en dates au lieu de 'w.01, w.02'.

En supposant que vous ayez enregistré le graphique de sirène ci-dessus m, faites:

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

Qui donne:

entrez la description de l'image ici


Utilisation de timevis

Depuis le timevis GitHub :

timevisvous permet de créer des visualisations de chronologie riches et entièrement interactives dans R. Les chronologies peuvent être incluses dans des applications Shiny et des documents de démarquage R, ou affichées à partir de la console R et de 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)

Qui donne:

entrez la description de l'image ici


Utilisation intrigue

Je suis tombé sur ce post fournissant une autre méthode utilisant plotly. Voici un exemple:

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

Qui donne:

entrez la description de l'image ici

Vous pouvez ensuite ajouter des informations et des annotations supplémentaires, personnaliser les polices et les couleurs, etc. (voir l'article de blog pour plus de détails)

Steven Beaupré
la source
C'est vraiment bien. Cependant il me semble assez difficile de créer automatiquement cette chaîne qui est passée à sirène, en utilisant des données stockées dans un dataframe.
George Dontas
Est-il possible d'afficher les dates sous forme d'étiquettes sur l'axe des x, au lieu de "w.01", "w.02", etc.?
George Dontas
2
Remplacer le diagramme de Gantt pour autoriser l'axe des dates personnalisé au lieu de l'échelle de 0-52 semaines: github.com/rich-iannone/DiagrammeR/issues/77
George Dontas
Le code fonctionne parfaitement en utilisant DiagrameR et Mermaid dans Rstudio, mais lors de son utilisation dans PowerBI, j'ai reçu un message d'erreur d'erreur: Aucune image n'a été créée. Le code R n'a abouti à la création d'aucun visuel. Assurez-vous que votre script R génère un tracé sur le périphérique par défaut R. N'importe quelle idée n'importe qui Merci Peddie
PeddiePooh
1
La solution avec timevisen Rsemble cool et simple. :-)
Suman Khanal
29

Un simple ggplot2diagramme de Gantt.

Tout d'abord, nous créons des données.

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

Maintenant, dessinez l'intrigue.

ggplot(mdfr, aes(value, name, colour = is.critical)) + 
  geom_line(size = 6) +
  xlab(NULL) + 
  ylab(NULL)
Coton Richie
la source
Je n'ai pu créer des données que deux fois :-)
George Dontas
@ gd047: Cela nécessite une facepalm à deux mains. Idiotie maintenant corrigée.
Richie Cotton
1
C'est très bien, mais ce que je recherche surtout, c'est un moyen d'afficher plus d'une barre pour chaque tâche (comme vous pouvez le voir dans les exemples que j'ai donnés), par exemple une pour la ligne de base et une pour la durée réelle de la tâche. Y a-t-il un moyen de faire quelque chose comme ça?
George Dontas
10

Pensez à utiliser le packageprojmanr (version 0.1.0 publiée sur CRAN le 23 août 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

Maintenant, commencez à préparer gantt:

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

entrez la description de l'image ici

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

entrez la description de l'image ici

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

entrez la description de l'image ici

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

entrez la description de l'image ici

user2030503
la source
7

Essaye ça:

install.packages("plotrix")
library(plotrix)
?gantt.chart
juur
la source
7

Le package planprend en charge la création de diagrammes de burndown et de diagrammes de Gantt et contient une plot.ganttfonction. Voir cette page du manuel graphique R

Découvrez également comment en créer un dans R en utilisant les diagrammes de GANTT de l'API R de Plotly dans R en utilisant PLOTLY .

George Dontas
la source
Cela fonctionne plutôt bien et est facile à adapter. J'ai écrit une petite fonction pour ajouter des événements qui s'étendent dans le temps: gist.github.com/crsh/4f9ce67f408611bc3974
crsh
5

Vous pouvez le faire avec le package 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)

entrez la description de l'image ici

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

vonjd
la source
4

J'ai utilisé et modifié l'exemple ci-dessus de Richie, travaillé comme un charme. Version modifiée pour montrer comment son modèle pourrait se traduire par l'ingestion de données CSV plutôt que par des éléments de texte fournis manuellement.

NOTE : La réponse de Richie manque indique que 2 paquets ( reshape et ggplot2 ) sont nécessaires pour le haut / bas du code au travail.

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()
je suis fatigué
la source
3

Voici un article que j'ai écrit sur l'utilisation de ggplot pour générer quelque chose comme un diagramme de Gantt. Pas très sophistiqué, mais pourrait vous donner des idées.

neilfws
la source
Merci, c'est vraiment utile
slackline
3

Pour moi, Gvistimeline était le meilleur outil pour ce faire, mais sa connexion en ligne requise ne m'était pas utile. Ainsi j'ai créé un package appelé vistimequi utilise plotly(similaire à la réponse de @Steven Beaupré), donc vous pouvez zoomer etc.:

https://github.com/shosaco/vistime

vistime: Créez des chronologies interactives ou des diagrammes de Gantt à l'aide de plotly.js. Les graphiques peuvent être inclus dans les applications Shiny et manipulés via 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")

entrez la description de l'image ici

shosaco
la source
3

Très vieille question, je sais, mais cela vaut peut-être la peine de laisser ici - insatisfait des réponses que j'ai trouvées à cette question - il y a quelques mois, j'ai créé un package de base pour créer des diagrammes de Gantt basés sur ggplot2 : ganttrify (plus de détails dans le readme du package) .

Exemple de sortie: entrez la description de l'image ici

Giocomai
la source
2

La bibliothèque PlotPrjNetworks fournit des outils de mise en réseau utiles pour la gestion de projet.

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)

entrez la description de l'image ici

George Dontas
la source
Merci @George pour cela, existe-t-il un moyen d'utiliser le nom des tâches de et vers? Dois-je le publier comme une nouvelle question? Basé sur doc github.com/cran/PlotPrjNetworks/blob/master/R/PlotPrjNetworks.R de et doit être un nombre entier, existe-t-il une solution rapide pour cela?
Mohsen Sichani le
1

Je voudrais améliorer le ggplot-Answer avec plusieurs barres pour chaque tâche.

Commencez par générer des données (dfrP est le data.frame de l'autre réponse, dfrR est un autre data.frame avec les dates de réalisation et mdfr est une fusion correspondant à l'instruction ggplot () suivante):

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)

Tracez maintenant ces données en utilisant des facettes pour le nom de la tâche:

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)

Sans les informations is.critiques, vous pourriez également utiliser Plan / Real comme couleur (ce que je préfère), mais je voulais utiliser le data.frame de l'autre réponse pour la rendre mieux comparable.

Thomas Runge
la source
1

Trouvé le geom_segment dans ggplot est génial. Des solutions précédentes, utilisez les données mais pas besoin de fondre.

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
la source