Хтось використовував R для створення діаграми Ганта ?
PS Я міг жити без стрілок залежності.
Хтось використовував R для створення діаграми Ганта ?
PS Я міг жити без стрілок залежності.
Відповіді:
Зараз існує кілька елегантних способів створити діаграму Ганта в R.
Використання канделя
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)
Використання 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
")
Знайдіть цей приклад та багато іншого на DiagrammeR
GitHub
Якщо ваші дані зберігаються в 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
(або будь-якого з ваших улюблених джерел перебору даних):
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 у коментарях, є невеликий хак який може дозволити змінити мітки осі 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 }'
)
))
))
Що дає:
Використання timevis
З timevis
GitHub :
timevis
дозволяє створювати розширені та повністю інтерактивні візуалізації часової шкали у R. Часові шкали можуть бути включені до програм Блискучі та документів розмітки 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)
Що дає:
Використовуючи сюжетно
Я випадково натрапив на цю публікацію, яка передбачає використання іншого методу 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
Що дає:
Потім можна додати додаткову інформацію та анотації, налаштувати шрифти та кольори тощо (докладніше див. У публікації в блозі)
timevis
in R
виглядає круто і просто. :-)
Простий 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)
Подумайте про використання пакету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)
# Create a second gantt chart using the processed data
res <- critical_path(data)
gantt(res)
# Use raw example data
data <- taskdata1
# Create a network diagram chart using the raw data
network_diagram(data)
# Create a second network diagram using the processed data
res <- critical_path(data)
network_diagram(res)
Пакет plan
підтримує створення вибухованих діаграм та діаграм Ганта і містить plot.gantt
функцію. Дивіться цю сторінку R Graphical Manual
Подивіться також, як зробити один у R, використовуючи Plotly's R API GANTT CHARTS IN R, PLOTLY USING .
Ви можете зробити це за допомогою пакета 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)
Джерело: https://cran.r-project.org/web/packages/googleVis/vignettes/googleVis_examples.html
Я використовував і модифікував наведений вище приклад від Річі, працював як шарм. Модифікована версія, щоб показати, як його модель може перетворити на передачу даних 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()
Ось допис, який я писав про використання ggplot для створення чогось на зразок діаграми Ганта. Не дуже витончений, але може дати вам кілька ідей.
Для мене Gvistimeline був найкращим інструментом для цього, але необхідне підключення до Інтернету мені не було корисним. Таким чином, я створив пакет із назвою, vistime
який використовує plotly
(подібно до відповіді @Steven Beaupré), тож ви можете збільшувати масштаб тощо:
https://github.com/shosaco/vistime
vistime
: Створіть інтерактивні часові шкали або діаграми Ганта за допомогою plotly.js. Діаграми можна включати в програми Shiny і маніпулювати за допомогою 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")
Бібліотека 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)
Я хотів би покращити ggplot-Answer кількома смужками для кожного завдання.
Спочатку згенеруйте деякі дані (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-information ви також можете використовувати Plan / Real як колір (який я б віддав перевагу), але я хотів використовувати data.frame іншої відповіді, щоб зробити його більш порівнянним.
Знайдено сегмент geom_ у ggplot - це чудово. З попередніх рішень використовуються дані, але не потрібно плавити.
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)
Ви можете поглянути на цю публікацію. Тут використовується R та ggplot.
https://dwh-businessintelligence.blogspot.nl/2016/05/what-if-for-project-management.html