In questa guida passo passo, vedremo cosโรจ un diagramma di Gantt, perchรฉ e quando queste visualizzazioni sono utili, come creare un diagramma di Gantt in Python con matplotlib e come personalizzarlo ulteriormente. Lungo il percorso, costruiremo alcuni esempi di diagramma di Gantt in matplotlib.
Cosโรจ un diagramma di Gantt e perchรฉ รจ utile?
Un diagramma di Gantt รจ un tipo di grafico a barre utilizzato per illustrare una pianificazione completa di progetto per la programmazione e la gestione. Mostra comunemente elementi come i nomi delle attivitร del progetto, le loro date di inizio e fine, i team a cui sono assegnate, lo stato di completamento in percentuale o frazione, le prestazioni per team e le tappe fondamentali del progetto.
I nomi delle attivitร sono disposti sullโasse y del diagramma di Gantt, di solito ordinati per data di inizio in ordine cronologico dallโalto verso il basso. Lโasse x invece serve a mostrare i periodi temporali, con la larghezza di ogni barra che corrisponde alla durata di esecuzione di ciascuna attivitร .
Poichรฉ un diagramma di Gantt รจ essenzialmente una forma specifica di grafico a barre orizzontali, possiamo crearlo in molte librerie di visualizzazione dati di Python, tra cui matplotlib, Plotly, Bokeh e Altair. In questo tutorial, ci concentreremo sulla creazione di diagrammi di Gantt nella piรน popolare tra queste โ matplotlib.
Come creare un diagramma di Gantt in Python con Matplotlib
Usando barh()
Cominciamo costruendo un diagramma di Gantt base in matplotlib usando il metodo barh() di matplotlib.pyplot.
Per prima cosa, dobbiamo importare le librerie necessarie:
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import datetime as dtOfferto da
Il passo successivo รจ creare dei dati di esempio su cui lavorare:
df = pd.DataFrame({'task':['A','B','C','D','E','F','G','H','I','J','K','L'],'team':['R&D','Accounting','Sales','Sales','IT','R&D','IT','Sales','Accounting','Accounting','Sales','IT'],'start': pd.to_datetime(['20 Oct 2022','24 Oct 2022','26 Oct 2022','31 Oct 2022','3 Nov 2022','7 Nov 2022','10 Nov 2022','14 Nov 2022','18 Nov 2022','23 Nov 2022','28 Nov 2022','30 Nov 2022']),'end': pd.to_datetime(['31 Oct 2022','28 Oct 2022','31 Oct 2022','8 Nov 2022','9 Nov 2022','18 Nov 2022','17 Nov 2022','22 Nov 2022','23 Nov 2022','1 Dec 2022','5 Dec 2022','5 Dec 2022']),'completion_frac':[1,1,1,1,1,0.95,0.7,0.35,0.1,0,0,0]})print(df)Offerto da
Output:
task team start end completion_frac
0 A R&D 2022-10-202022-10-311.001 B Accounting 2022-10-242022-10-281.002 C Sales 2022-10-262022-10-311.003 D Sales 2022-10-312022-11-081.004 E IT 2022-11-032022-11-091.005 F R&D 2022-11-072022-11-180.956 G IT 2022-11-102022-11-170.707 H Sales 2022-11-142022-11-220.358 I Accounting 2022-11-182022-11-230.109 J Accounting 2022-11-232022-12-010.0010 K Sales 2022-11-282022-12-050.0011 L IT 2022-11-302022-12-050.00Offerto da
Per facilitare la costruzione di un diagramma di Gantt per questi dati, dobbiamo calcolare altre quattro colonne che rappresenteranno le seguenti informazioni:
Quanti giorni sono passati/passerebbero dallโinizio complessivo del progetto alla data di inizio di ciascuna attivitร :
df['days_to_start']=(df['start']- df['start'].min()).dt.daysOfferto da
Quanti giorni sono passati/passerebbero dallโinizio complessivo del progetto alla data di fine di ciascuna attivitร :
df['days_to_end']=(df['end']- df['start'].min()).dt.daysOfferto da
La durata di ciascuna attivitร , includendo sia la data di inizio che quella di fine:
df['task_duration']= df['days_to_end']- df['days_to_start']+1# to include also the end dateOfferto da
Lo stato di completamento di ciascuna attivitร convertito da frazione in una quota di giorni allocati a quellโattivitร :
df['completion_days']= df['completion_frac']* df['task_duration']Offerto da
task team start end completion_frac days_to_start \
0 A R&D 2022-10-202022-10-311.0001 B Accounting 2022-10-242022-10-281.0042 C Sales 2022-10-262022-10-311.0063 D Sales 2022-10-312022-11-081.00114 E IT 2022-11-032022-11-091.00145 F R&D 2022-11-072022-11-180.95186 G IT 2022-11-102022-11-170.70217 H Sales 2022-11-142022-11-220.35258 I Accounting 2022-11-182022-11-230.10299 J Accounting 2022-11-232022-12-010.003410 K Sales 2022-11-282022-12-050.003911 L IT 2022-11-302022-12-050.0041
days_to_end task_duration completion_days
0111212.001855.0021166.0031999.0042077.005291211.4062885.6073393.1583460.6094290.00104680.00114660.00Offerto da
Ora siamo pronti a generare un diagramma di Gantt di base in matplotlib:
plt.barh(y=df['task'], width=df['task_duration'], left=df['days_to_start'])
plt.show()Offerto da
Output:
Il grafico sopra necessita di diversi aggiustamenti per poter estrarre il massimo delle informazioni:
Aggiungere un titolo significativo e le etichette dellโasse x (date)
Invertire lโasse y per avere tutte le attivitร in ordine cronologico dallโalto verso il basso
Aggiungere una griglia
Colorare le attivitร per team
Mostrare una legenda
Aggiungere lo stato di completamento delle attivitร
Metteremo in pratica presto tutte queste migliorie. Prima, perรฒ, vediamo come gestire la creazione di un diagramma di Gantt di base.
Usando broken_barh()
Quando alcune attivitร contengono due o piรน sotto-attivitร distribuite su un periodo di tempo, dovremmo usare un altro metodo di matplotlib โ broken_barh().
Per avere dei dati di esempio su cui provare questo approccio, facciamo quanto segue:
Prendiamo dal dataframe iniziale solo le attivitร assegnate al team Sales (per ora, ignoriamo la colonna completion_frac).
Rinominiamo le colonne start ed end in start_1 ed end_1 rispettivamente (per comoditร ).
Aggiungiamo piรน sotto-attivitร ad alcune delle attivitร disponibili.
Per ciascuna sotto-attivitร , calcoliamo le tre colonne mostrate sopra che rappresentano le seguenti informazioni:
Quanti giorni sono passati/passerebbero dallโinizio complessivo del progetto alla data di inizio di ciascuna sotto-attivitร .
Quanti giorni sono passati/passerebbero dallโinizio complessivo del progetto alla data di fine di ciascuna sotto-attivitร .
La durata di ciascuna sotto-attivitร , includendo sia la data di inizio che quella di fine.
# 1
df2 = df[df['team']=='Sales'][['task','team','start','end']]# 2
df2.rename(columns={'start':'start_1','end':'end_1'}, inplace=True)
df2.reset_index(drop=True, inplace=True)# 3
df2['start_2']= pd.to_datetime([None,'10 Nov 2022','25 Nov 2022',None])
df2['end_2']= pd.to_datetime([None,'14 Nov 2022','28 Nov 2022',None])
df2['start_3']= pd.to_datetime([None,None,'1 Dec 2022',None])
df2['end_3']= pd.to_datetime([None,None,'5 Dec 2022',None])# 4for i in[1,2,3]:
suffix ='_'+str(i)
df2['days_to_start'+ suffix]=(df2['start'+ suffix]- df2['start_1'].min()).dt.days
df2['days_to_end'+ suffix]=(df2['end'+ suffix]- df2['start_1'].min()).dt.days
df2['task_duration'+ suffix]= df2['days_to_end'+ suffix]- df2['days_to_start'+ suffix]+1print(df2)Offerto da
Output:
task team start_1 end_1 start_2 end_2 start_3 \
0 C Sales 2022-10-262022-10-31 NaT NaT NaT
1 D Sales 2022-10-312022-11-082022-11-102022-11-14 NaT
2 H Sales 2022-11-142022-11-222022-11-252022-11-282022-12-013 K Sales 2022-11-282022-12-05 NaT NaT NaT
end_3 days_to_start_1 days_to_end_1 task_duration_1 \
0 NaT 0561 NaT 513922022-12-05192793 NaT 33408
days_to_start_2 days_to_end_2 task_duration_2 days_to_start_3 \
0 NaN NaN NaN NaN
115.019.05.0 NaN
230.033.04.036.03 NaN NaN NaN NaN
days_to_end_3 task_duration_3
0 NaN NaN
1 NaN NaN
240.05.03 NaN NaN Offerto da
Nota che ora lโattivitร D ha due sotto-attivitร , lโattivitร H ne ha tre e le attivitร C e K ne hanno una ciascuna. Pertanto, le attivitร D e H sono quelle per cui applicheremo il metodo broken_barh(). Poichรฉ la sintassi di questo metodo รจ un poโ meno intuitiva di quella di barh(), diamo unโocchiata ai suoi parametri principali e al loro formato. I parametri obbligatori di broken_barh() sono:
xranges โ una sequenza di tuple nel formato (xmin, xwidth) per indicare lโinizio e lโestensione di ciascuna barra. Qui, ogni barra rappresenta una sotto-attivitร . Quindi, questo parametro mostra la data di inizio e la durata di ciascuna sotto-attivitร .
yrange โ una tupla nel formato (ymin, yheight) per indicare la posizione y e lโaltezza di ciascuna barra.
Ora, tracciamo il nostro diagramma di Gantt "spezzato". Lโalgoritmo รจ il seguente:
Crea una figura con sottotrame.
Itera sulle righe del dataframe e controlla se lโattivitร ha una, due o tre sotto-attivitร . In base a ciรฒ, procedi cosรฌ:
Una sotto-attivitร : traccia una barra usando il metodo barh() come fatto in precedenza.
Due sotto-attivitร : traccia due barre usando il metodo broken_barh().
Tre sotto-attivitร : traccia tre barre usando il metodo broken_barh().
Aggiungi gli aggiustamenti di base: imposta e etichetta i tick dellโasse y.
Nel codice sopra, possiamo in realtร usare il metodo broken_barh() per tracciare le barre anche per le attivitร con una sola sotto-attivitร . In questo caso, dobbiamo sostituire questa riga di codice:
ax.barh(y=df2['task'], width=df2['task_duration_1'], left=df2['days_to_start_1'])Offerto da
con questa:
ax.broken_barh(xranges=[(row['days_to_start_1'], row['task_duration_1'])], yrange=(index +1,0.5))Offerto da
Questo approccio renderebbe anche il nostro codice piรน uniforme e leggibile.
Come personalizzare un diagramma di Gantt in Matplotlib
task team start end completion_frac days_to_start \
0 A R&D 2022-10-202022-10-311.0001 B Accounting 2022-10-242022-10-281.0042 C Sales 2022-10-262022-10-311.0063 D Sales 2022-10-312022-11-081.00114 E IT 2022-11-032022-11-091.00145 F R&D 2022-11-072022-11-180.95186 G IT 2022-11-102022-11-170.70217 H Sales 2022-11-142022-11-220.35258 I Accounting 2022-11-182022-11-230.10299 J Accounting 2022-11-232022-12-010.003410 K Sales 2022-11-282022-12-050.003911 L IT 2022-11-302022-12-050.0041
days_to_end task_duration completion_days
0111212.001855.0021166.0031999.0042077.005291211.4062885.6073393.1583460.6094290.00104680.00114660.00Offerto da
e al nostro primo diagramma di Gantt:
plt.barh(y=df['task'], width=df['task_duration'], left=df['days_to_start'])
plt.show()Offerto da
Output:
In particolare, vogliamo aggiungere alcune personalizzazioni a questo grafico per renderlo piรน informativo.
Avere un titolo significativo รจ fondamentale per qualsiasi grafico, incluso un diagramma di Gantt. Supponiamo che il nostro progetto si chiami Project X:
plt.barh(y=df['task'], width=df['task_duration'], left=df['days_to_start'])
plt.title('Project Management Schedule of Project X', fontsize=15)
plt.show()Offerto da
Output:
Regolare e personalizzare gli assi e aggiungere una griglia
In questo passaggio, estenderemo il codice precedente ed eseguiremo le seguenti azioni:
Creare una figura con sottotrame per poter lavorare con lโoggetto ax.
Invertire lโasse y per avere tutte le attivitร in ordine cronologico dallโalto verso il basso.
Determinare le posizioni ottimali dei tick sullโasse x.
Diciamo che vogliamo posizionare i tick dellโasse x ogni lunedรฌ, tenendo presente che Project X รจ iniziato di giovedรฌ.
Optiamo solo per tick principali per evitare di appesantire il grafico.
Determinare le giuste etichette dei tick sullโasse x e un formato appropriato.
Anche qui, teniamo presente che Project X รจ iniziato di giovedรฌ e dobbiamo etichettare solo i lunedรฌ.
Poichรฉ Project X รจ interamente nel 2022, non serve specificare lโanno per ogni data.
ร importante assicurarsi che il numero di tick sullโasse x sia uguale a quello delle relative etichette.
Se ti serve piรน pratica con Python per scrivere e leggere qualsiasi codice Python con facilitร , il nostro corso Intermediate Python รจ un buon punto di riferimento.
Colorare le attivitร per team
Ora, attribuiamo un colore a ciascuna barra (che rappresenta una specifica attivitร ) in base al team a cui รจ assegnata. A questo scopo, faremo quanto segue:
Creare un dizionario con i nomi dei team come chiavi e i colori base di matplotlib come valori.
Creare una figura con sottotrame.
Iterare sulle righe del dataframe, creare una barra per ogni riga e aggiungere il colore corrispondente al team.
Aggiungere tutti gli aggiustamenti di base applicati in precedenza.
Una cosa che manca nellโesempio di diagramma di Gantt sopra รจ una legenda che mostri quale colore corrisponde a quale team. Per risolvere, creiamo delle patch โ oggetti 2D di matplotlib riempiti con un colore predefinito. Useremo la classe matplotlib.patches.Patch per generare un elenco di patch, una per ciascun team, colorate di conseguenza:
patches =[]for team in team_colors:
patches.append(matplotlib.patches.Patch(color=team_colors[team]))Offerto da
Ora siamo pronti ad aggiungere una legenda al nostro grafico:
fig, ax = plt.subplots()for index, row in df.iterrows():
plt.barh(y=row['task'], width=row['task_duration'], left=row['days_to_start']+1, color=team_colors[row['team']])
plt.title('Project Management Schedule of Project X', fontsize=15)
plt.gca().invert_yaxis()
ax.set_xticks(xticks)
ax.set_xticklabels(xticklabels[::7])
ax.xaxis.grid(True, alpha=0.5)# Adding a legend
ax.legend(handles=patches, labels=team_colors.keys(), fontsize=11)
plt.show()Offerto da
Output:
Il diagramma di Gantt sopra appare molto piรน informativo.
Finora, non abbiamo usato la completion_days column che abbiamo calcolato allโinizio di questo tutorial. La useremo ora per rendere il nostro diagramma di Gantt piรน informativo mostrando a che punto di completamento si trova ciascuna attivitร .
Tecnicamente, aggiungeremo unโaltra barra sopra ciascuna barra giร costruita. La barra inferiore rappresenterร la durata complessiva di ciascuna attivitร in giorni allocati, mentre quella superiore corrisponderร allo stato di completamento di tale attivitร in giorni allocati.ย
Per ciascuna attivitร , entrambe le barre avranno lo stesso colore del relativo team, ma la barra inferiore sarร piรน chiara di quella superiore per evidenziare la differenza tra le due.
In altre parole, se un team sta overperformando su unโattivitร , la combinazione di queste due barre mostrerร come se il team avesse giร lavorato piรน giorni su quellโattivitร di quanto previsto (il che significa che probabilmente lโattivitร verrร completata prima della scadenza).ย
Nel caso opposto, se un team sta underperformando su unโattivitร , la combinazione delle barre mostrerร come se il team avesse lavorato meno giorni su quellโattivitร di quanto previsto (il che significa che probabilmente lโattivitร verrร completata dopo la scadenza).
fig, ax = plt.subplots()for index, row in df.iterrows():# Adding a lower bar - for the overall task duration
plt.barh(y=row['task'], width=row['task_duration'], left=row['days_to_start']+1, color=team_colors[row['team']], alpha=0.4)# Adding an upper bar - for the status of completion
plt.barh(y=row['task'], width=row['completion_days'], left=row['days_to_start']+1, color=team_colors[row['team']])
plt.title('Project Management Schedule of Project X', fontsize=15)
plt.gca().invert_yaxis()
ax.set_xticks(xticks)
ax.set_xticklabels(xticklabels[::7])
ax.xaxis.grid(True, alpha=0.5)
ax.legend(handles=patches, labels=team_colors.keys(), fontsize=11)
plt.show()Offerto da
Output:
Dal grafico sopra, possiamo vedere che i team non avanzano allo stesso ritmo nel completare le attivitร , cosa comune in molti progetti reali. Per ottenere piรน informazioni da questo grafico, supponiamo che la data attuale sia il 17 novembre 2022 e segniamola sul nostro grafico:
fig, ax = plt.subplots()for index, row in df.iterrows():
plt.barh(y=row['task'], width=row['task_duration'], left=row['days_to_start']+1, color=team_colors[row['team']], alpha=0.4)
plt.barh(y=row['task'], width=row['completion_days'], left=row['days_to_start']+1, color=team_colors[row['team']])
plt.title('Project Management Schedule of Project X', fontsize=15)
plt.gca().invert_yaxis()
ax.set_xticks(xticks)
ax.set_xticklabels(xticklabels[::7])
ax.xaxis.grid(True, alpha=0.5)
ax.legend(handles=patches, labels=team_colors.keys(), fontsize=11)# Marking the current date on the chart
ax.axvline(x=29, color='r', linestyle='dashed')
ax.text(x=29.5, y=11.5, s='17/11', color='r')
plt.show()Offerto da
Output:
Possiamo fare le seguenti osservazioni sullo stato attuale di Project X:
Il team R&D sta overperformando sullโattivitร F e probabilmente la completerร prima della scadenza.
Il team IT รจ in ritardo sullโattivitร G e probabilmente ha bisogno di supporto.
Il team Sales sta procedendo secondo la pianificazione sullโattivitร H.
Il team Accounting ha iniziato lโattivitร I in anticipo rispetto alla pianificazione del progetto.
Osservazioni di questo tipo possono aiutare i team leader e il project manager ad adeguare di conseguenza la pianificazione del progetto e allocare tempestivamente le risorse necessarie per evitare ritardi nelle consegne.
Altri possibili aggiustamenti
Possiamo aggiungere ulteriori dettagli al nostro diagramma di Gantt in matplotlib. Ad esempio:
Aggiungere la percentuale di completamento su ciascuna barra.
Suddividere alcune attivitร in sotto-attivitร (abbiamo giร visto come farlo tecnicamente in precedenza in questo tutorial).
Annotare attivitร correlate.
Segnare tappe fondamentali e scadenze cruciali.
Evidenziare weekend e festivitร .
Ordinare le barre per team o tipo di attivitร .
Aggiungere tick minori sullโasse x per aumentare la granularitร delle informazioni.
Migliorare la formattazione e il layout complessivi del grafico.
ร importante, tuttavia, mantenere pulito il nostro diagramma di Gantt ed evitare di sovraccaricarlo con troppi dettagli. Come per qualsiasi altra visualizzazione di dati, dobbiamo mantenere il giusto equilibrio tra la capacitร informativa del grafico e la sua leggibilitร , cosรฌ come la leggibilitร del codice usato per costruirlo.
Inizia a creare il tuo diagramma di Gantt in Python con Matplotlib
Per riassumere, in questo tutorial abbiamo esplorato:
cosโรจ un diagramma di Gantt
quali informazioni mostra
quando si usa
i diversi modi e le sfumature per creare diagrammi di Gantt con matplotlib
come creare un diagramma di Gantt in Python con matplotlibย
come regolarlo ulteriormente per renderlo piรน informativo
come interpretare il risultato finale.ย
Inoltre, abbiamo visto vari esempi di diagrammi di Gantt e il processo passo passo per costruirli.
Per un approccio piรน integrato allโapprendimento di come creare grafici efficaci e informativi in Python, dai unโocchiata al nostro skill track Data Visualization with Python.
Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocitร dei workflow.
In questa guida passo passo, vedremo cosโรจ un diagramma di Gantt, perchรฉ e quando queste visualizzazioni sono utili, come creare un diagramma di Gantt in Python con matplotlib e come personalizzarlo ulteriormente. Lungo il percorso, costruiremo alcuni esempi di diagramma di Gantt in matplotlib.
Cosโรจ un diagramma di Gantt e perchรฉ รจ utile?
Un diagramma di Gantt รจ un tipo di grafico a barre utilizzato per illustrare una pianificazione completa di progetto per la programmazione e la gestione. Mostra comunemente elementi come i nomi delle attivitร del progetto, le loro date di inizio e fine, i team a cui sono assegnate, lo stato di completamento in percentuale o frazione, le prestazioni per team e le tappe fondamentali del progetto.
I nomi delle attivitร sono disposti sullโasse y del diagramma di Gantt, di solito ordinati per data di inizio in ordine cronologico dallโalto verso il basso. Lโasse x invece serve a mostrare i periodi temporali, con la larghezza di ogni barra che corrisponde alla durata di esecuzione di ciascuna attivitร .
Poichรฉ un diagramma di Gantt รจ essenzialmente una forma specifica di grafico a barre orizzontali, possiamo crearlo in molte librerie di visualizzazione dati di Python, tra cui matplotlib, Plotly, Bokeh e Altair. In questo tutorial, ci concentreremo sulla creazione di diagrammi di Gantt nella piรน popolare tra queste โ matplotlib.
Se vuoi esplorare modi alternativi per creare un diagramma di Gantt e altri tipi di grafici in Python, dai unโocchiata al corso Introduction to Data Visualization with Plotly in Python. Se hai bisogno di rinfrescare o sviluppare le tue competenze in matplotlib, ti saranno utili questi corsi: Introduction to Data Visualization with Matplotlib e Python for MATLAB Users.
Come creare un diagramma di Gantt in Python con Matplotlib
Usando barh()
Cominciamo costruendo un diagramma di Gantt base in matplotlib usando il metodo
barh()dimatplotlib.pyplot.Per prima cosa, dobbiamo importare le librerie necessarie:
Il passo successivo รจ creare dei dati di esempio su cui lavorare:
Output:
Per facilitare la costruzione di un diagramma di Gantt per questi dati, dobbiamo calcolare altre quattro colonne che rappresenteranno le seguenti informazioni:
Controlliamo cosa abbiamo ottenuto:
Output:
Ora siamo pronti a generare un diagramma di Gantt di base in matplotlib:
Output:
Il grafico sopra necessita di diversi aggiustamenti per poter estrarre il massimo delle informazioni:
Metteremo in pratica presto tutte queste migliorie. Prima, perรฒ, vediamo come gestire la creazione di un diagramma di Gantt di base.
Usando
broken_barh()Quando alcune attivitร contengono due o piรน sotto-attivitร distribuite su un periodo di tempo, dovremmo usare un altro metodo di matplotlib โ
broken_barh().Per avere dei dati di esempio su cui provare questo approccio, facciamo quanto segue:
completion_frac).startedendinstart_1edend_1rispettivamente (per comoditร ).Output:
Nota che ora lโattivitร D ha due sotto-attivitร , lโattivitร H ne ha tre e le attivitร C e K ne hanno una ciascuna. Pertanto, le attivitร D e H sono quelle per cui applicheremo il metodo
broken_barh(). Poichรฉ la sintassi di questo metodo รจ un poโ meno intuitiva di quella dibarh(), diamo unโocchiata ai suoi parametri principali e al loro formato. I parametri obbligatori dibroken_barh()sono:xrangesโ una sequenza di tuple nel formato (xmin,xwidth) per indicare lโinizio e lโestensione di ciascuna barra. Qui, ogni barra rappresenta una sotto-attivitร . Quindi, questo parametro mostra la data di inizio e la durata di ciascuna sotto-attivitร .yrangeโ una tupla nel formato (ymin,yheight) per indicare la posizione y e lโaltezza di ciascuna barra.Ora, tracciamo il nostro diagramma di Gantt "spezzato". Lโalgoritmo รจ il seguente:
barh()come fatto in precedenza.broken_barh().broken_barh().Output:
Nel codice sopra, possiamo in realtร usare il metodo
broken_barh()per tracciare le barre anche per le attivitร con una sola sotto-attivitร . In questo caso, dobbiamo sostituire questa riga di codice:con questa:
Questo approccio renderebbe anche il nostro codice piรน uniforme e leggibile.
Come personalizzare un diagramma di Gantt in Matplotlib
Torniamo al nostro dataframe iniziale:
Output:
e al nostro primo diagramma di Gantt:
Output:
In particolare, vogliamo aggiungere alcune personalizzazioni a questo grafico per renderlo piรน informativo.
Per approfondire la personalizzazione dei grafici con matplotlib, considera queste risorse: Matplotlib Tutorial: Python Plotting e Matplotlib Cheat Sheet: Plotting in Python.
Regolazioni di base del diagramma di Gantt
Queste includono:
Aggiungere un titolo al grafico
Avere un titolo significativo รจ fondamentale per qualsiasi grafico, incluso un diagramma di Gantt. Supponiamo che il nostro progetto si chiami Project X:
Output:
Regolare e personalizzare gli assi e aggiungere una griglia
In questo passaggio, estenderemo il codice precedente ed eseguiremo le seguenti azioni:
ax.Output:
Se ti serve piรน pratica con Python per scrivere e leggere qualsiasi codice Python con facilitร , il nostro corso Intermediate Python รจ un buon punto di riferimento.
Colorare le attivitร per team
Ora, attribuiamo un colore a ciascuna barra (che rappresenta una specifica attivitร ) in base al team a cui รจ assegnata. A questo scopo, faremo quanto segue:
Output:
Aggiungere una legenda
Una cosa che manca nellโesempio di diagramma di Gantt sopra รจ una legenda che mostri quale colore corrisponde a quale team. Per risolvere, creiamo delle patch โ oggetti 2D di matplotlib riempiti con un colore predefinito. Useremo la classe matplotlib.patches.Patch per generare un elenco di patch, una per ciascun team, colorate di conseguenza:
Ora siamo pronti ad aggiungere una legenda al nostro grafico:
Output:
Il diagramma di Gantt sopra appare molto piรน informativo.
Troverai altre tecniche per migliorare lโestetica e la leggibilitร dei grafici nel corso Improving Your Data Visualizations in Python.
Aggiungere lo stato di completamento
Finora, non abbiamo usato la
completion_days columnche abbiamo calcolato allโinizio di questo tutorial. La useremo ora per rendere il nostro diagramma di Gantt piรน informativo mostrando a che punto di completamento si trova ciascuna attivitร .Tecnicamente, aggiungeremo unโaltra barra sopra ciascuna barra giร costruita. La barra inferiore rappresenterร la durata complessiva di ciascuna attivitร in giorni allocati, mentre quella superiore corrisponderร allo stato di completamento di tale attivitร in giorni allocati.ย
Per ciascuna attivitร , entrambe le barre avranno lo stesso colore del relativo team, ma la barra inferiore sarร piรน chiara di quella superiore per evidenziare la differenza tra le due.
In altre parole, se un team sta overperformando su unโattivitร , la combinazione di queste due barre mostrerร come se il team avesse giร lavorato piรน giorni su quellโattivitร di quanto previsto (il che significa che probabilmente lโattivitร verrร completata prima della scadenza).ย
Nel caso opposto, se un team sta underperformando su unโattivitร , la combinazione delle barre mostrerร come se il team avesse lavorato meno giorni su quellโattivitร di quanto previsto (il che significa che probabilmente lโattivitร verrร completata dopo la scadenza).
Output:
Dal grafico sopra, possiamo vedere che i team non avanzano allo stesso ritmo nel completare le attivitร , cosa comune in molti progetti reali. Per ottenere piรน informazioni da questo grafico, supponiamo che la data attuale sia il 17 novembre 2022 e segniamola sul nostro grafico:
Output:
Possiamo fare le seguenti osservazioni sullo stato attuale di Project X:
Osservazioni di questo tipo possono aiutare i team leader e il project manager ad adeguare di conseguenza la pianificazione del progetto e allocare tempestivamente le risorse necessarie per evitare ritardi nelle consegne.
Altri possibili aggiustamenti
Possiamo aggiungere ulteriori dettagli al nostro diagramma di Gantt in matplotlib. Ad esempio:
ร importante, tuttavia, mantenere pulito il nostro diagramma di Gantt ed evitare di sovraccaricarlo con troppi dettagli. Come per qualsiasi altra visualizzazione di dati, dobbiamo mantenere il giusto equilibrio tra la capacitร informativa del grafico e la sua leggibilitร , cosรฌ come la leggibilitร del codice usato per costruirlo.
Inizia a creare il tuo diagramma di Gantt in Python con Matplotlib
Per riassumere, in questo tutorial abbiamo esplorato:
Inoltre, abbiamo visto vari esempi di diagrammi di Gantt e il processo passo passo per costruirli.
Per un approccio piรน integrato allโapprendimento di come creare grafici efficaci e informativi in Python, dai unโocchiata al nostro skill track Data Visualization with Python.