2010-08-23 3 views
58

Кто-нибудь использовал R, чтобы создать Gantt chart? Единственное решение, о котором я знаю, это this, но я ищу что-то более сложное, если возможно (более или менее похожее на this или this).Ганта диаграммы с R

P.S. Я мог бы жить без стрелок зависимости.

ответ

62

Есть теперь несколько элегантных способов для создания диаграммы Ганта в R.

Использование 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

Найти этот пример и многое другое на DiagrammeRGitHub


Если ваши данные хранятся в data.frame, вы можете создать строку для перехода к mermaid() путем преобразования ее в соответствующий формат.

Рассмотрим следующий пример:

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 

Использование dplyr и tidyr (или любой из ваших любимых данных пререканий RESSOURCES):

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

Согласно упоминается @GeorgeDontas в комментариях, есть little hack, что позволяет менять метки оси x на даты вместо «w.01, w.02».

Предполагая, что вы сохранили выше русалка графа в m, сделайте следующее:

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

Что дает:

enter image description here


Использование timevis

От timevisGitHub:

timevis позволяет создавать богатые и полностью интерактивные временной шкалы визуализации в Р. Timelines могут быть включены в Shiny приложения и R уценки документов, или смотреть с R консоли и 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) 

Что дает:

enter image description here


Использование plotly

Я наткнулся на это post обеспечивая другой метод с использованием plotly. Вот пример:

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 

Что дает:

enter image description here

Вы можете добавить дополнительную информацию и аннотации, настраивать шрифты и цвета и т.д. (см блоге подробности)

+0

Это действительно хорошо. Однако мне кажется, что довольно сложно автоматически создать эту строку, которая передается на русалку, используя данные, хранящиеся в фрейме данных. –

+0

Можно ли отображать даты как метки оси x, а не «w.01», «w.02» и т. Д.? –

+0

@GeorgeDontas На самом деле это довольно просто, см. Обновление. –

4

Here's a post, что я написал об использовании ggplot для создания чего-то вроде диаграммы Ганта. Не очень сложный, но может дать вам некоторые идеи.

+0

Спасибо, тот действительно полезный – slackline

26

Простой ggplot2 диаграмма Ганта.

Во-первых, мы создаем некоторые данные.

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

Теперь нарисуйте участок.

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

я мог создать только некоторые данные дважды :-) –

+0

@ gd047: Это требует двуручной Facepalm. Идиотизм теперь исправлен. –

+1

Это очень приятно, но то, что я в основном ищу, это способ показать более одного бара для каждой задачи (как вы можете видеть в примерах, которые я дал), например. один для базовой линии и один для фактической продолжительности задачи. Есть ли способ сделать что-то подобное? –

7

Попробуйте это:

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

Пакет plan поддерживает создание Burndown графиков и диаграмм Ганта и содержит plot.gantt функцию. См. this R Graphical Manual page

См. Также, как сделать это в R, используя API R10 Plotly. GANTT CHARTS IN R USING PLOTLY.

+0

Это работает очень хорошо и легко адаптируется. Я написал небольшую функцию для добавления событий, которые растягиваются во времени: https://gist.github.com/crsh/4f9ce67f408611bc3974 – crsh

3

Я использовал и модифицировал приведенный выше пример от Ричи, работал как шарм. Модифицированная версия, чтобы показать, как его модель могла бы перевести на данные CSV, а не на текстовые элементы вручную.

Примечание: ответ Ричи не хватает указания, которые необходимы для выше/ниже код для работы 2 упаковки ( и ggplot2перекроить).

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

Библиотека PlotPrjNetworks предоставляет полезные сетевые инструменты для управления проектами.

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

Вы можете сделать это с 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

Источник: https://cran.r-project.org/web/packages/googleVis/vignettes/googleVis_examples.html

1

Я хотел бы улучшить ggplot-ответ с несколькими брусья для каждой задачи.

Сначала сгенерируйте некоторые данные (dfrP является data.frame другого ответа, dfrR некоторые другие data.frame с датами реализации и mdfr является слияние подгонки к следующему 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) 

Теперь сюжет этих данных с помощью фасетов для имени задачи:

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) 

без is.critical-информации вы можете также использовать план/Real как цвет (который я предпочитаю), но я хотел бы использовать data.frame другого ответа, чтобы сделать его более сопоставимым.

0

Для меня Gvistimeline был лучший инструмент, чтобы сделать это, но его требуется интернет-соединение не было полезно для меня. Таким образом, я создал пакет Кальес vistime, который использует plotly (аналогично ответ @Steven Beaupré), так что вы можете увеличить и т.д .:

https://github.com/shosaco/vistime

vistime: Создание интерактивных временных рамок или диаграмму Ганта с использованием plotly .js. Графики могут быть включены в приложения Shiny и управляться через 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

Рассмотрим использовать package projmanr (версия 0.1.0 выпущена на CRAN 23 августа 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 

Сейчас начинают готовить Ганта:

# 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

Смежные вопросы