Ayuda. Estoy tratando de hacer un diagrama de Gantt de forma gráfica, y no veo la manera de hacerlo. Un diagrama de Gantt es similar a un diagrama de barras horizontales, con una coordenada de punto de "inicio" dada para cada barra. Entonces se ve así:

   XXXXX
      XXXXXX
   XXXXXXXXXXXXXXXXXXXXX
            XXXX

No puedo encontrar una manera de hacer que las 'barras' en un gráfico de barras comiencen en una coordenada X específica. ¿Algún consejo / truco / pista?

1
user3089203 25 ene. 2016 a las 22:54

6 respuestas

La mejor respuesta

Aquí están mis resultados ... no es un diagrama de Gantt perfecto (no se puede cambiar el tamaño de la barra, no hay dependencias entre las entradas) pero lo suficientemente bueno para mi propósito:

enter image description here

Un fragmento de código para mostrar cómo hice el seguimiento transparente:

        // loop through all obj's to draw, for each one
        // make a transparent offset to mimic gantt chart.
        traces.push( {
           x: [ obj.totalrunTime ],
           y: [ key ],
           name: key,
           text: [ obj.totalrunTime+' '+key ], 
           orientation: 'h',
           marker: { color: obj.color },
           type: 'bar'
        });
        traces.push( {
           x: [ offset ],
           y: [ key ],
           showlegend: false,
           orientation: 'h',
           marker: { color: 'rgba(255,255,255,0)' },
           hoverinfo: "none",
           name: key,
           type: 'bar'
        });

        offset = offset + jobs[key].totalrunTime;
1
user3089203 26 ene. 2016 a las 01:32

Este es un diagrama de Gantt con trazado

El contenido de "test.data":
El formato es: Tarea \ t Iniciar \ t Finalizar \ t Recurso

A   2017-04-26 10:12:04 2017-04-26 10:34:18 Done
B   2017-04-26 10:54:18 2017-04-26 11:07:41 Done
C   2017-04-26 11:47:42 2017-04-26 12:25:12 Done
A   2017-04-26 12:35:12 2017-04-26 13:28:29 Done
B   2017-04-26 13:48:29 2017-04-26 14:07:50 Done
A   2017-04-26 14:37:50 2017-04-26 15:12:08 Done
B   2017-04-26 15:32:09 2017-04-26 15:44:43 Done
C   2017-04-27 07:14:46 2017-04-27 07:29:48 Done
A   2017-04-27 08:49:48 2017-04-27 09:06:07 Done
A   2017-04-27 09:38:03 2017-04-27 09:59:03 Done
C   2017-04-27 10:09:03 2017-04-27 10:27:40 Done
B   2017-04-27 11:07:40 B2017-04-27 11:23:48    Done

Aquí está el código:

import plotly.offline as offline
import plotly.plotly as py
import plotly.figure_factory as ff
import plotly.graph_objs as go
import plotly.io as pio
import pandas as pd
import numpy as np

filePath="test.data"

df = pd.read_table(filePath,
                   header=None,
                   usecols=[0,1,2,3],
                   sep='\t',
                   converters={1:np.datetime64, 2:np.datetime64},
                   )
df.columns = ['Task', 'Start', 'Finish', 'Resource']

colors = {'Done': 'rgb(0, 240, 0)',}

fig = ff.create_gantt(df,
                      title='My Tasks',
                      bar_width=0.1,
                      showgrid_x=False,
                      showgrid_y=False,
                      colors=colors,
                      #colors='Viridis',
                      index_col='Resource',
                      show_colorbar = True,
                      group_tasks=True,
                     )

fig['layout'].update(plot_bgcolor = 'rgba(0,0,0,250)',
                     paper_bgcolor = 'rgba(0,0,0,0)',
                     showlegend = True,
                     violinmode='overlay',
                     colorway = ['rgb(0, 150, 0)'],
                    )
pio.write_image(fig, 'testdata.pdf', format='pdf', width=1000, height=1000, scale=1)

El resultado:

enter image description here

0
Dark 20 mar. 2019 a las 10:47

El paquete R vistime usa Plotly para crear un diagrama de Gantt. También hay una especie de distribución vertical inteligente de los eventos en el gráfico, de modo que el gráfico no es más grande de lo necesario.

install.packages("vistime")
library(vistime)
pres <- data.frame(Position = rep(c("President", "Vice"), each = 3),
                   Name = c("Washington", rep(c("Adams", "Jefferson"), 2), "Burr"),
                   start = c("1789-03-29", "1797-02-03", "1801-02-03"),
                   end = c("1797-02-03", "1801-02-03", "1809-02-03"),
                   color = c('#cbb69d', '#603913', '#c69c6e'),
                   fontcolor = c("black", "white", "black"))

vistime(pres, events="Position", groups="Name", title="Presidents of the USA")

example

0
shosaco 27 ene. 2019 a las 15:47

Si usa plotly, use group_tasks=True si quiere tener claves similares en una línea.

1
derhannes 25 jul. 2018 a las 16:13

¡Si! importar plotly.figure_factory como ff

Ff.create_gantt (df)

Plotly ha incorporado diagramas de Gantt. No es necesario crearlos a partir de un gráfico de barras. Puede alimentarlo con una lista de diccionarios o puede alimentarlo con un marco de datos. Si hace lo último, asegúrese de indicarle a la figura qué columna es la tarea y sus fechas de inicio y finalización. Me resultó mucho más fácil usar datatime y etiquetar las columnas Inicio y Finalizar. de esta forma el diagrama de gantt los leerá automáticamente la documentación se encuentra en el siguiente enlace.

https://plot.ly/python/gantt/

1
lwileczek 28 jul. 2017 a las 16:14

Riddhiman ha creado una gran solución para esto en R. http://moderndata.plot.ly/gantt-charts-in- r-using-plotly /. Al principio era reacio a causa del bucle, pero me da una enorme libertad.

Agregué un poco de diseño adicional para mis necesidades:

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]),  # x0, x1
             y         = c(i, i),  # y0, y1
             mode      = "lines+markers+text",
             marker    = list(color  = df$color[i]
                             ,symbol = "line-ns-open"
                             ,size   = 13), #markers ensures visability
             text      = c(df$text[i],"") # adds a text string
             textposition = "middle left" #to the left of the bar
             line      = list(color  = df$color[i]
                            , width  = 20),
             showlegend = F,
             hoverinfo = "text",

             # Create custom hover text

             text      = paste0("<b>Task:</b> ",     df$Task[i],     "<br>",
                                "<b>Duration:</b> ", df$Duration[i], " days<br>",
                                "<b>Resource:</b> ", df$Resource[i]),

             evaluate  = T  # needed to avoid lazy loading
)}  
1
mtcarsalot 12 may. 2016 a las 07:50