superponer - Diagramas de Gantt con R
superponer graficas en r (12)
Ahora hay algunas maneras elegantes de generar un diagrama de Gantt en R.
Usando 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
")
Encuentre este ejemplo y muchos más en DiagrammeR
GitHub
Si sus datos están almacenados en un data.frame
, puede crear la cadena para pasar a mermaid()
convirtiéndolo al formato apropiado.
Considera lo siguiente:
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
Usando dplyr
y tidyr
(o cualquiera de tus recursos de disputa de datos favoritos):
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"
)
)
Como se menciona por @GeorgeDontas en los comentarios, hay un pequeño truco que podría permitir cambiar las etiquetas del eje x a las fechas en lugar de ''w.01, w.02''.
Suponiendo que haya guardado el gráfico de sirena anterior en m
, haga lo siguiente:
m$x$config = list(ganttConfig = list(
axisFormatter = list(list(
"%b %d, %Y"
,htmlwidgets::JS(
''function(d){ return d.getDay() == 1 }''
)
))
))
Lo que da:
Usando timevis
Desde el timevis
GitHub :
timevis
permite crear visualizaciones de línea de tiempo ricas y completamente interactivas en R. Los cronogramas se pueden incluir en las aplicaciones Shiny y los documentos de rebaja R, o se pueden ver desde la consola R y 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)
Lo que da:
Usando plotly
Me encontré con esta post proporciona otro método usando plotly
. Aquí hay un ejemplo:
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
Lo que da:
A continuación, puede agregar información adicional y anotaciones, personalizar fuentes y colores, etc. (ver la publicación de blog para más detalles)
¿Alguien ha usado R para crear un diagrama de Gantt ? La única solución de la que soy consciente es this , pero estoy buscando algo más sofisticado, si es posible (mirando más o menos así o this ).
PD: podría vivir sin las flechas de dependencia.
Considere utilizar el paquete projmanr
(versión 0.1.0 lanzada en CRAN el 23 de agosto de 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
Ahora comienza a preparar Gantt:
# 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)
El plan
paquete es compatible con la creación de gráficos burndown y diagramas de Gantt y contiene una función plot.gantt
. Vea esta página del Manual Gráfico R
Vea también cómo hacer uno en R usando la R API de post .
Library PlotPrjNetworks proporciona útiles herramientas de red para Project Management.
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)
Me gustaría mejorar la ggplot-Answer con varias barras para cada tarea.
Primero genere algunos datos (dfrP es el marco de datos de la otra respuesta, dfrR es otro data.frame con fechas de realización y mdfr es una fusión que se ajusta al siguiente ggplot () - statement):
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)
Ahora trace estos datos usando facetas para el nombre de la tarea:
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)
Sin la información crítica, también podría usar Plan / Real como color (que yo preferiría), pero quería usar el marco de datos de la otra respuesta para que sea más comparable.
Para mí, Gvistimeline fue la mejor herramienta para hacer esto, pero su conexión en línea requerida no fue útil para mí. Por lo tanto, creé un paquete vistime
que usa plotly
(similar a la respuesta de @Steven Beaupré), por lo que puedes hacer zoom, etc.
https://github.com/shosaco/vistime
vistime
:vistime
líneas de tiempo interactivas o diagramas de Gantt usando plotly.js. Los gráficos se pueden incluir en aplicaciones brillantes y manipularse a través de 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")
Prueba esto:
install.packages("plotrix")
library(plotrix)
?gantt.chart
Puedes echarle un vistazo a esta publicación. Esto usa R y ggplot.
https://dwh-businessintelligence.blogspot.nl/2016/05/what-if-for-project-management.html
Puedes hacerlo con el paquete de 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)
Fuente: https://cran.r-project.org/web/packages/googleVis/vignettes/googleVis_examples.html
Un simple ggplot2
gantt ggplot2.
Primero, creamos algunos datos.
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"))
Ahora dibuja la trama.
ggplot(mdfr, aes(value, name, colour = is.critical)) +
geom_line(size = 6) +
xlab(NULL) +
ylab(NULL)
Usé y modifiqué el ejemplo anterior de Richie, funcionó como un amuleto. Versión modificada para mostrar cómo su modelo podría traducirse en la ingesta de datos CSV en lugar de elementos de texto proporcionados manualmente.
NOTA : Faltaba la respuesta de Richie indicando que se necesitan 2 paquetes ( remodelación y ggplot2 ) para que el código anterior / siguiente funcione.
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()
Aquí hay una publicación que escribí sobre el uso de ggplot para generar algo así como un diagrama de Gantt. No es muy sofisticado, pero podría darte algunas ideas.