webentwicklung-frage-antwort-db.com.de

Balkendiagramme mit R

Hat jemand mit R ein Gantt-Diagramm erstellt? Die einzige Lösung, die mir bewusst ist, ist dies , aber ich suche nach etwas Anspruchsvollerem, wenn möglich (sieht mehr oder weniger aus wie dies oder this ).

P.S. Ich könnte ohne die Abhängigkeitspfeile leben.

73
George Dontas

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

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

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

enter image description here

Dieses und viele weitere Beispiele finden Sie unter DiagrammeRGitHub


Wenn Ihre Daten in einem data.frame Gespeichert sind, können Sie den an mermaid() zu übergebenden String erstellen, indem Sie ihn 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 dplyr und tidyr (oder einer Ihrer bevorzugten Datenverarbeitungsressourcen):

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 ein kleiner Hack , mit dem die Beschriftungen der x-Achse in Datumsangaben anstelle von 'w.01, w.02' geändert werden können.

Angenommen, Sie haben das obige Meerjungfrau-Diagramm in m gespeichert, dann tun Sie Folgendes:

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

Welches gibt:

enter image description here


Mit timevis

Aus dem timevisGitHub :

Mit timevis können Sie umfangreiche und vollständig interaktive Zeitleisten-Visualisierungen in R erstellen. Zeitleisten können in Shiny-Apps und R-Abschriften-Dokumenten enthalten sein oder über die R-Konsole und 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:

enter image description here


Verwenden von plotly

Ich stolperte über diese post Bereitstellung einer anderen Methode mit 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:

enter image description here

Sie können dann zusätzliche Informationen und Anmerkungen hinzufügen, Schriftarten und Farben anpassen usw. (Einzelheiten finden Sie im Blogbeitrag).

85
Steven Beaupré

Eine einfache ggplot2 Gantt-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 den Plot.

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

Verwenden Sie das Paket projmanr (Version 0.1.0, veröffentlicht auf CRAN am 23. August 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

Beginnen Sie nun mit der Vorbereitung von 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

9
user2030503

Das Paket plan unterstützt die Erstellung von Burndown-Diagrammen und Gantt-Diagrammen und enthält ein plot.gantt Funktion. Siehe diese grafische Handbuchseite

Siehe auch, wie man eine in R mit der R-API von Plotly erstellt GANTT CHARTS IN R USING PLOTLY .

7
George Dontas

Versuche dies:

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

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)

enter image description here

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

5
vonjd

Ich habe das obige Beispiel von Richie verwendet und modifiziert und es hat wie ein Zauber gewirkt. Geänderte Version, um zu zeigen, wie sein Modell CSV-Daten einlesen kann, anstatt manuell bereitgestellte Textelemente.

[~ # ~] note [~ # ~] : Richies Antwort fehlte der Hinweis, dass 2 Pakete (mformung und - ggplot2) wird benötigt, damit der oben/unten stehende Code funktioniert.

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

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.

4
neilfws

Für mich war Gvistimeline das beste Tool, aber die erforderliche Online-Verbindung war für mich nicht hilfreich. So habe ich ein Paket mit dem Namen vistime erstellt, das plotly verwendet (ähnlich der Antwort von @Steven Beaupré), damit Sie zoomen können.

https://github.com/shosaco/vistime

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

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

2
shosaco

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)

enter image description here

1
George Dontas

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

Generieren Sie zuerst einige Daten (dfrP ist das data.frame der anderen Antwort, dfrR ist ein anderes data.frame mit Realisierungsdaten und mdfr ist eine Zusammenführung, die zur folgenden ggplot () - Anweisung passt):

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 unter Verwendung von 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-Informationen könnten Sie auch Plan/Real als Farbe verwenden (was ich vorziehen würde), aber ich wollte den data.frame der anderen Antwort verwenden, um ihn besser vergleichbar zu machen.

1
Thomas Runge

Sie können sich diesen Beitrag ansehen. Dies verwendet R und ggplot.

https://dwh-businessintelligence.blogspot.nl/2016/05/what-if-for-project-management.html

r and ggplot Gantt chart

1

Ich fand das geom_segment in ggplot großartig. Bei den vorherigen Lösungen werden die Daten verwendet, es ist jedoch kein Schmelzen erforderlich.

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

0
Kbushu