Gantt-Diagramme mit R.


Antworten:


103

Es gibt jetzt einige elegante Möglichkeiten, ein Gantt-Diagramm in R zu erstellen.

Candela benutzen

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)

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

Finden Sie dieses und viele weitere Beispiele auf DiagrammeR GitHub


Wenn Ihre Daten in a gespeichert sind data.frame, können Sie die zu übergebende Zeichenfolge erstellen, mermaid()indem Sie sie in das richtige Format konvertieren.

Folgendes berücksichtigen:

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

Verwenden von dplyrund tidyr(oder einer Ihrer bevorzugten Datenquellen):

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

Wie von @GeorgeDontas in den Kommentaren erwähnt, gibt es einen kleinen Hack , der es ermöglichen könnte, die Beschriftungen der x-Achse in Datumsangaben anstelle von 'w.01, w.02' zu ändern.

Angenommen, Sie haben das obige Meerjungfrauen-Diagramm in gespeichert m, gehen Sie wie folgt vor :

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

Welches gibt:

Geben Sie hier die Bildbeschreibung ein


Timevis verwenden

Vom timevis GitHub :

timevisMit dieser Option können Sie umfangreiche und vollständig interaktive Timeline-Visualisierungen in R erstellen . Timelines können in Shiny-Apps und R-Markdown-Dokumenten enthalten sein oder über die R-Konsole und den RStudio Viewer angezeigt werden.

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)

Welches gibt:

Geben Sie hier die Bildbeschreibung ein


Plotly verwenden

Ich bin auf diesen Beitrag gestoßen, der eine andere Methode zur Verfügung stellt plotly. Hier ist ein Beispiel:

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

Welches gibt:

Geben Sie hier die Bildbeschreibung ein

Sie können dann zusätzliche Informationen und Anmerkungen hinzufügen, Schriftarten und Farben anpassen usw. (Details siehe Blog-Beitrag)


Es ist in der Tat schön. Es scheint mir jedoch ziemlich schwierig zu sein, diese Zeichenfolge, die an die Meerjungfrau übergeben wird, mithilfe von Daten, die in einem Datenrahmen gespeichert sind, automatisch zu erstellen.
George Dontas

Ist es möglich, Datumsangaben als Beschriftungen der x-Achse anstelle von "w.01", "w.02" usw. anzuzeigen?
George Dontas

2
Überschreiben Sie das Gantt-Diagramm, um eine benutzerdefinierte Datumsachse anstelle einer 0-52-Wochen-Skala zuzulassen: github.com/rich-iannone/DiagrammeR/issues/77
George Dontas

Der Code funktioniert perfekt mit DiagrameR und Mermaid in Rstudio, aber bei Verwendung in PowerBI wurde eine Fehlermeldung angezeigt. Fehlermeldung: Es wurde kein Bild erstellt. Der R-Code führte nicht zur Erstellung von Grafiken. Stellen Sie sicher, dass Ihr R-Skript zu einem Plot auf dem R-Standardgerät führt. Jede Idee jemand Danke Peddie
PeddiePooh

1
Die Lösung mit timevisin Rsieht cool und einfach aus. :-)
Suman Khanal

29

Ein einfaches ggplot2Gantt-Diagramm.

Zuerst erstellen wir einige Daten.

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

Zeichnen Sie nun die Handlung.

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

Ich konnte nur einige Daten zweimal erstellen :-)
George Dontas

@ gd047: Das erfordert eine zweihändige Gesichtspalme. Idiotie jetzt behoben.
Richie Cotton

1
Es ist sehr schön, aber ich suche hauptsächlich nach einer Möglichkeit, mehr als einen Balken für jede Aufgabe anzuzeigen (wie Sie in den Beispielen sehen können, die ich gegeben habe), z. B. einen für die Grundlinie und einen für die tatsächliche Aufgabendauer. Gibt es eine Möglichkeit, so etwas zu tun?
George Dontas

10

Erwägen Sie die Verwendung des Paketsprojmanr (Version 0.1.0, veröffentlicht am 23. August 2017 auf CRAN).

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

Beginnen Sie nun mit der Vorbereitung von gantt:

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

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein


7

Versuche dies:

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

7

Das Paket planunterstützt die Erstellung von Burndown-Diagrammen und Gantt-Diagrammen und enthält eine plot.ganttFunktion. Siehe diese Seite mit dem R-Grafikhandbuch

Siehe auch, wie Sie mit Plotlys R-API eine G in R erstellen . GANTT CHARTS IN R VERWENDEN VON PLOTLY .


Dies funktioniert ziemlich gut und ist einfach anzupassen. Ich habe eine kleine Funktion geschrieben, um Ereignisse hinzuzufügen, die sich über die Zeit erstrecken: gist.github.com/crsh/4f9ce67f408611bc3974
crsh

5

Sie können dies mit dem GoogleVis-Paket tun :

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)

Geben Sie hier die Bildbeschreibung ein

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


4

Ich habe das obige Beispiel von Richie verwendet und modifiziert, es hat wie ein Zauber funktioniert. Geänderte Version, um zu zeigen, wie sein Modell in die Aufnahme von CSV-Daten anstatt in manuell bereitgestellte Textelemente übersetzt werden kann.

HINWEIS : Richie Antwort fehlte Hinweis darauf , dass zwei Pakete ( reshape und ggplot2 ) für die oben / unten Code zur Arbeit benötigt werden.

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

3

Hier ist ein Beitrag , den ich über die Verwendung von ggplot geschrieben habe, um so etwas wie ein Gantt-Diagramm zu generieren. Nicht sehr raffiniert, könnte Ihnen aber einige Ideen geben.


Danke, das ist wirklich nützlich
Slackline

3

Für mich war Gvistimeline das beste Tool, um dies zu tun, aber die erforderliche Online-Verbindung war für mich nicht nützlich. Daher habe ich ein Paket namens verwendet vistime, das verwendet plotly(ähnlich der Antwort von @Steven Beaupré), damit Sie zoomen können usw.:

https://github.com/shosaco/vistime

vistime: Erstellen Sie mit plotly.js interaktive Zeitleisten oder Gantt-Diagramme. Die Diagramme können in Shiny-Apps enthalten und über plotly_build () bearbeitet werden.

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

Geben Sie hier die Bildbeschreibung ein


3

Sehr alte Frage, ich weiß, aber vielleicht lohnt es sich, hier zu bleiben, dass ich - unzufrieden mit den Antworten, die ich auf diese Frage gefunden habe - vor einigen Monaten ein Basispaket für die Erstellung von ggplot2-basierten Gantt-Diagrammen erstellt habe: ganttrify (weitere Details in der Readme- Datei des Pakets) .

Beispielausgabe: Geben Sie hier die Bildbeschreibung ein


2

Die Bibliothek PlotPrjNetworks bietet nützliche Netzwerkwerkzeuge für das Projektmanagement.

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)

Geben Sie hier die Bildbeschreibung ein


Vielen Dank an @George, gibt es eine Möglichkeit, den Namen von Aufgaben in von und nach zu verwenden? Soll ich ihn als neue Frage veröffentlichen? Basierend auf doc github.com/cran/PlotPrjNetworks/blob/master/R/PlotPrjNetworks.R von und um ganzzahlig zu sein, gibt es eine schnelle Lösung dafür?
Mohsen Sichani

1

Ich möchte die ggplot-Antwort mit mehreren Balken für jede Aufgabe verbessern.

Generieren Sie zuerst einige Daten (dfrP ist der data.frame der anderen Antwort, dfrR ist ein anderer data.frame mit Realisierungsdaten und mdfr ist eine Zusammenführungsanpassung an die folgende ggplot () - Anweisung):

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)

Zeichnen Sie nun diese Daten mit Facetten für den Aufgabennamen:

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)

Ohne die is.critical-Information könnten Sie auch Plan / Real als Farbe verwenden (was ich bevorzugen würde), aber ich wollte den data.frame der anderen Antwort verwenden, um die Vergleichbarkeit zu verbessern.


1

Fand das geom_segment in ggplot ist großartig. Aus den vorherigen Lösungen verwenden Sie die Daten, müssen aber nicht schmelzen.

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.