Diagrama de Gantt en plotly

Datos de muestra

Un diagrama de Gantt representa un conjunto de tareas y sus tiempos estimados de ejecución a través del tiempo representadas mediante rectángulos. En el siguiente data frame se muestran cinco tareas, su fecha de inicio y fin, la persona asignada para hacerla y su nivel de dificultad.

import pandas as pd

df = pd.DataFrame([
    dict(Tarea = "Tarea A", Inicio = '2013-09-05', Fin = '2013-10-25', Asignado = "Persona A", Dificultad = 70),
    dict(Tarea = "Tarea B", Inicio = '2013-12-03', Fin = '2014-02-14', Asignado = "Persona A", Dificultad = 20),
    dict(Tarea = "Tarea C", Inicio = '2013-10-20', Fin = '2014-03-17', Asignado = "Persona B", Dificultad = 30),
    dict(Tarea = "Tarea D", Inicio = '2014-02-21', Fin = '2014-07-06', Asignado = "Persona A", Dificultad = 50),
    dict(Tarea = "Tarea E", Inicio = '2014-06-20', Fin = '2014-09-28', Asignado = "Persona B", Dificultad = 80)
])

Diagrama de Gantt con timeline

Plotly Python proporciona una función llamada timeline a través del módulo plotly express para crear diagramas de Gantt de manera sencilla. Tendrás que pasar tu data frame y especificar los nombres de columna que representan las fechas de inicio y fin a x_start y x_end, respectivamente y el nombre de la columna que contiene las tareas a y. Establece autorange = "reversed" para ordenar las tareas de arriba a abajo.

Diagrama de Gantt en Plotly

import plotly.express as px
import pandas as pd

fig = px.timeline(df, x_start = "Inicio", x_end = "Fin", y = "Tarea")
# Tareas ordenadas de arriba a abajo
fig.update_yaxes(autorange = "reversed") 
fig.show()

Agregar un título

Con el argumento title se puede agregar un título a la figura.

import plotly.express as px
import pandas as pd

fig = px.timeline(df, x_start = "Inicio", x_end = "Fin", y = "Tarea", title = "Tareas")
# Tareas ordenadas de arriba a abajo
fig.update_yaxes(autorange = "reversed") 
fig.show()

Etiqueta del eje Y

Puedes sobrescribir la etiqueta del eje Y por defecto pasando un diccionario a labels, siendo la key el nombre de la variable pasada a y. Si quieres establecer un título para el eje X tendrás que usar el argumento xaxis_title de la función update_layout.

import plotly.express as px
import pandas as pd

# Etiqueta del eje Y
y_label = {'Tarea': 'Etiqueta del eje Y'}

fig = px.timeline(df, x_start = "Inicio", x_end = "Fin", y = "Tarea", labels = y_label)
# Tareas ordenadas de arriba a abajo
fig.update_yaxes(autorange = "reversed")
# Etiqueta del eje X
fig.update_layout(xaxis_title = "Etiqueta del eje X") 
fig.show()

Gantt con textos

La función timeline proporciona un argumento llamado text donde puedes pasar un array con textos o especificar el nombre de la columna del data frame que quieras utilizar para crear los textos.

import plotly.express as px
import pandas as pd

fig = px.timeline(df, x_start = "Inicio", x_end = "Fin", y = "Tarea", text = "Dificultad")
# Tareas ordenadas de arriba a abajo
fig.update_yaxes(autorange = "reversed") 
fig.show()

Personalización del color

Existen varias formas de personalizar el color de un time line o diagrama de Gantt hecho con plotly express.

Color de las barras

Si quieres sobrescribir el color por defecto de las barras tendrás que especificar un nuevo color haciendo uso del argumento color_discrete_sequence. Ten en cuenta que el color tiene que especificarse usando un array.

import plotly.express as px
import pandas as pd

fig = px.timeline(df, x_start = "Inicio", x_end = "Fin", y = "Tarea",
                  color_discrete_sequence = ["darkorange"])
# Tareas ordenadas de arriba a abajo
fig.update_yaxes(autorange = "reversed") 
fig.show()

Color diferente para cada tarea

Si quieres establecer un color diferente para cada tarea tendrás que crear un diccionario especificando el color deseado para cada una y pasarlo a color_discrete_map. En este escenario no tendrás que revertir la escala del eje Y.

import plotly.express as px
import pandas as pd

colores = {"Tarea A": "red", "Tarea B": "orange", "Tarea C": "blue",
           "Tarea D": "purple", "Tarea E": "yellow"}

fig = px.timeline(df, x_start = "Inicio", x_end = "Fin", y = "Tarea",
                  color = "Tarea", color_discrete_map = colores)
fig.show()

Color en base a la persona asignada (variable discreta)

El argumento color de la función timeline se puede utilizar para cambiar el color de las tareas en función de una variable categórica. En el ejemplo siguiente usamos la columna llamada "Asignado" que especifica la persona asignada para realizar cada tarea.

import plotly.express as px
import pandas as pd

fig = px.timeline(df, x_start = "Inicio", x_end = "Fin", y = "Tarea",
                  color = "Asignado")
# Tareas ordenadas de arriba a abajo
fig.update_yaxes(autorange = "reversed") 
fig.show()

Selección de color

Es posible personalizar los colores si las barras están coloreadas en base a una variable categórica pasando un array con tantos colores como grupos al argumento color_discrete_sequence de la función.

import plotly.express as px
import pandas as pd

colors = ["darkorange", "dodgerblue"]

fig = px.timeline(df, x_start = "Inicio", x_end = "Fin", y = "Tarea", color = "Asignado",
                  color_discrete_sequence = colors)
# Tareas ordenadas de arriba a abajo
fig.update_yaxes(autorange = "reversed") 
fig.show()

Color en base a la dificultad (variable continua)

El color también se puede basar en una variable numérica que represente, por ejemplo, la dificultad o el porcentaje completado de la tarea.

import plotly.express as px
import pandas as pd

fig = px.timeline(df, x_start = "Inicio", x_end = "Fin", y = "Tarea",
                  color = "Dificultad")
# Tareas ordenadas de arriba a abajo
fig.update_yaxes(autorange = "reversed") 
fig.show()

Escala de color continua

El punto central de la escala de color continua se puede modificar con color_continuous_midpoint. Además, si quieres sobrescribir la escala de color por defecto puedes especificar una nueva paleta de color continua con color_continuous_scale.

import plotly.express as px
import pandas as pd

fig = px.timeline(df, x_start = "Inicio", x_end = "Fin", y = "Tarea",
                  color = "Dificultad", color_continuous_scale = "viridis")
# Tareas ordenadas de arriba a abajo
fig.update_yaxes(autorange = "reversed") 
fig.show()
Data Sketches

A journey of imagination, exploration, and beautiful data visualizations

Comprar en Amazon
Fundamentals of Data Visualization

A Primer on Making Informative and Compelling Figures

Comprar en Amazon

También te puede interesar