मुख्य सामग्री पर जाएँ

Matplotlib के साथ Python में Gantt चार्ट कैसे बनाएं

matplotlib के साथ Python में Gantt चार्ट बनाना सीखें और जानें कि ऐसी विज़ुअलाइज़ेशन क्यों उपयोगी हैं।
· 10 मि॰ पढ़ें

AI के साथ खोजें

इस चरण-दर-चरण मार्गदर्शिका में, हम समझेंगे कि Gantt चार्ट क्या है, ऐसी विज़ुअलाइज़ेशन क्यों और कब उपयोगी होती हैं, matplotlib के साथ Python में Gantt चार्ट कैसे बनाया जाता है, और इसे आगे कैसे कस्टमाइज़ किया जा सकता है। इसी दौरान, हम matplotlib में कुछ Gantt चार्ट के उदाहरण भी बनाएंगे।

Gantt चार्ट क्या है और यह क्यों उपयोगी है?

Gantt चार्ट बार प्लॉट का एक प्रकार है जिसका उपयोग संपूर्ण प्रोजेक्ट की योजना और प्रबंधन अनुसूची को दर्शाने के लिए किया जाता है। इसमें आम तौर पर प्रोजेक्ट टास्क के नाम, उनके आरंभ और समाप्ति तिथियां, जिन टीमों को वे टास्क सौंपे गए हैं, टास्क पूर्णता की स्थिति (प्रतिशत या भिन्न में), टीम के आधार पर प्रदर्शन, और प्रोजेक्ट के महत्वपूर्ण माइलस्टोन जैसी विशेषताएं दिखाई जाती हैं।

Gantt चार्ट के y-अक्ष पर टास्क के नाम व्यवस्थित होते हैं, जिन्हें आमतौर पर ऊपर से नीचे कालानुक्रमिक क्रम में उनकी आरंभ तिथियों के अनुसार सॉर्ट किया जाता है। इसके विपरीत, x-अक्ष समय अवधि दिखाने का काम करता है, जहां प्रत्येक बार की चौड़ाई उस टास्क के क्रियान्वयन की अवधि के अनुरूप होती है।

चूंकि Gantt चार्ट मूलतः एक क्षैतिज बार प्लॉट का विशेष रूप है, हम इसे Python की कई डेटा विज़ुअलाइज़ेशन लाइब्रेरीज़ में बना सकते हैं, जिनमें matplotlib, Plotly, Bokeh, और Altair शामिल हैं। इस ट्यूटोरियल में, हम सबसे लोकप्रिय लाइब्रेरी – matplotlib – में Gantt चार्ट बनाने पर ध्यान देंगे।

यदि आप Python में Gantt चार्ट और अन्य प्रकार के प्लॉट बनाने के वैकल्पिक तरीके आज़माना चाहते हैं, तो Introduction to Data Visualization with Plotly in Python कोर्स देखें। अगर आपको matplotlib कौशल को ताज़ा या विकसित करना है, तो ये कोर्स उपयोगी रहेंगे: Introduction to Data Visualization with Matplotlib और Python for MATLAB Users।

Matplotlib के साथ Python में Gantt चार्ट कैसे बनाएं

barh() का उपयोग करना

आइए matplotlib.pyplot की barh() मेथड का उपयोग करके एक बुनियादी matplotlib Gantt चार्ट बनाकर शुरू करें।

पहले, हमें आवश्यक लाइब्रेरीज़ डाउनलोड करनी होंगी:

import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import datetime as dt

अगला कदम काम करने के लिए डमी डेटा बनाना है:

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)

आउटपुट:

  task        team      start        end  completion_frac
0     A         R&D 2022-10-20 2022-10-31             1.00
1     B  Accounting 2022-10-24 2022-10-28             1.00
2     C       Sales 2022-10-26 2022-10-31             1.00
3     D       Sales 2022-10-31 2022-11-08             1.00
4     E          IT 2022-11-03 2022-11-09             1.00
5     F         R&D 2022-11-07 2022-11-18             0.95
6     G          IT 2022-11-10 2022-11-17             0.70
7     H       Sales 2022-11-14 2022-11-22             0.35
8     I  Accounting 2022-11-18 2022-11-23             0.10
9     J  Accounting 2022-11-23 2022-12-01             0.00
10    K       Sales 2022-11-28 2022-12-05             0.00
11    L          IT 2022-11-30 2022-12-05             0.00

इस डेटा के लिए Gantt चार्ट बनाना आसान करने हेतु, हमें चार और कॉलम निकालने होंगे जो निम्नलिखित जानकारी का प्रतिनिधित्व करेंगे:

  1. कुल प्रोजेक्ट शुरू होने से प्रत्येक टास्क की आरंभ तिथि तक कितने दिन बीते/बीतेंगे:
df['days_to_start'] = (df['start'] - df['start'].min()).dt.days
  1. कुल प्रोजेक्ट शुरू होने से प्रत्येक टास्क की समाप्ति तिथि तक कितने दिन बीते/बीतेंगे:
df['days_to_end'] = (df['end'] - df['start'].min()).dt.days
  1. आरंभ और समाप्ति तिथियों दोनों सहित प्रत्येक टास्क की अवधि:
df['task_duration'] = df['days_to_end'] - df['days_to_start'] + 1  # to include also the end date
  1. प्रत्येक टास्क की पूर्णता स्थिति को भिन्न से उक्त टास्क को आवंटित दिनों के हिस्से में परिवर्तित करना:
df['completion_days'] = df['completion_frac'] * df['task_duration']

आइए देखें कि हमें क्या मिला:

print(df)

आउटपुट:

  task        team      start        end  completion_frac  days_to_start  \
0     A         R&D 2022-10-20 2022-10-31             1.00              0  
1     B  Accounting 2022-10-24 2022-10-28             1.00              4  
2     C       Sales 2022-10-26 2022-10-31             1.00              6  
3     D       Sales 2022-10-31 2022-11-08             1.00             11  
4     E          IT 2022-11-03 2022-11-09             1.00             14  
5     F         R&D 2022-11-07 2022-11-18             0.95             18  
6     G          IT 2022-11-10 2022-11-17             0.70             21  
7     H       Sales 2022-11-14 2022-11-22             0.35             25  
8     I  Accounting 2022-11-18 2022-11-23             0.10             29  
9     J  Accounting 2022-11-23 2022-12-01             0.00             34  
10    K       Sales 2022-11-28 2022-12-05             0.00             39  
11    L          IT 2022-11-30 2022-12-05             0.00             41  

    days_to_end  task_duration  completion_days 
0            11             12            12.00 
1             8              5             5.00 
2            11              6             6.00 
3            19              9             9.00 
4            20              7             7.00 
5            29             12            11.40 
6            28              8             5.60 
7            33              9             3.15 
8            34              6             0.60 
9            42              9             0.00 
10           46              8             0.00 
11           46              6             0.00 

अब, हम matplotlib में एक बुनियादी Gantt चार्ट बनाने के लिए तैयार हैं:

plt.barh(y=df['task'], width=df['task_duration'], left=df['days_to_start'])
plt.show()

आउटपुट:

Matplotlib में Gantt चार्ट

उपरोक्त प्लॉट को अधिकतम जानकारी निकालने योग्य बनाने के लिए हमें इसमें कुछ समायोजन करने होंगे:

  • अर्थपूर्ण शीर्षक और x-लेबल (तिथियां) जोड़ना
  • y-अक्ष को उलटना ताकि सभी टास्क ऊपर से नीचे कालानुक्रमिक क्रम में हों
  • ग्रिड जोड़ना
  • टीम के अनुसार टास्क को रंगना
  • लीजेंड दिखाना
  • टास्क पूर्णता की स्थिति जोड़ना

हम जल्द ही ये सभी परिशोधन लागू करेंगे। हालांकि, उससे पहले यह देखें कि बुनियादी Gantt चार्ट बनाते समय कैसे निपटें।

broken_barh() का उपयोग करना

जब कुछ टास्क में समय अवधि में फैले दो या अधिक सबटास्क होते हैं, तो हमें एक और matplotlib मेथड – broken_barh() – का उपयोग करना चाहिए।

इस तरीके को आज़माने के लिए कुछ डमी डेटा पाने हेतु, आइए निम्न करें:

  1. हमारे शुरुआती डेटाफ़्रेम से केवल वे टास्क लें जो Sales टीम को सौंपे गए थे (अभी के लिए, completion_frac कॉलम को नज़रअंदाज़ करें)।
  2. start और end कॉलम का नाम क्रमशः start_1 और end_1 कर दें (सुविधा के लिए)।
  3. उपलब्ध कुछ टास्क में और सबटास्क जोड़ें।
  4. प्रत्येक सबटास्क के लिए, ऊपर दिखाए गए अनुसार तीन कॉलम की गणना करें जो निम्नलिखित जानकारी दर्शाएं:
    • कुल प्रोजेक्ट शुरू होने से प्रत्येक सबटास्क की आरंभ तिथि तक कितने दिन बीते/बीतेंगे।
    • कुल प्रोजेक्ट शुरू होने से प्रत्येक सबटास्क की समाप्ति तिथि तक कितने दिन बीते/बीतेंगे।
    • आरंभ और समाप्ति तिथियों दोनों सहित प्रत्येक सबटास्क की अवधि।
# 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])

# 4
for 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] + 1


print(df2)

आउटपुट:

task   team    start_1      end_1    start_2      end_2    start_3  \
0    C  Sales 2022-10-26 2022-10-31        NaT        NaT        NaT  
1    D  Sales 2022-10-31 2022-11-08 2022-11-10 2022-11-14        NaT  
2    H  Sales 2022-11-14 2022-11-22 2022-11-25 2022-11-28 2022-12-01  
3    K  Sales 2022-11-28 2022-12-05        NaT        NaT        NaT  

      end_3  days_to_start_1  days_to_end_1  task_duration_1  \
0        NaT                0              5                6  
1        NaT                5             13                9  
2 2022-12-05               19             27                9  
3        NaT               33             40                8  

  days_to_start_2  days_to_end_2  task_duration_2  days_to_start_3  \
0              NaN            NaN              NaN              NaN  
1             15.0           19.0              5.0              NaN  
2             30.0           33.0              4.0             36.0  
3              NaN            NaN              NaN              NaN  

  days_to_end_3  task_duration_3 
0            NaN              NaN 
1            NaN              NaN 
2           40.0              5.0 
3            NaN              NaN 

ध्यान दें कि अब टास्क D के दो सबटास्क हैं, टास्क H के तीन सबटास्क हैं, और टास्क C तथा K में एक-एक सबटास्क है। अतः, broken_barh() मेथड हम टास्क D और H पर लागू करेंगे। चूंकि इस मेथड का सिंटैक्स barh() से थोड़ा कम सहज है, आइए इसके मुख्य पैरामीटर और उनके फ़ॉर्मेट पर नज़र डालें। broken_barh() के अनिवार्य पैरामीटर हैं:

  • xranges – ट्यूपल्स का अनुक्रम, फ़ॉर्मेट (xmin, xwidth) में, जो प्रत्येक बार की शुरुआत और उसकी चौड़ाई को दर्शाता है। यहां हर बार एक सबटास्क है। इसलिए यह पैरामीटर प्रत्येक सबटास्क की आरंभ तिथि और अवधि दर्शाता है।
  • yrange – ट्यूपल फ़ॉर्मेट (ymin, yheight) में, जो प्रत्येक बार की y-पोज़िशन और ऊंचाई बताता है।

अब, अपना "टूटा हुआ" Gantt चार्ट प्लॉट करें। एल्गोरिथ्म इस प्रकार है:

  1. सबप्लॉट्स के साथ एक फ़िगर बनाएँ।
  2. डेटाफ़्रेम की पंक्तियों पर इटररेट करें और जांचें कि टास्क में एक, दो, या तीन सबटास्क हैं। उसके आधार पर निम्न करें:
    • एक सबटास्क: पहले की तरह barh() मेथड से एक बार प्लॉट करें।
    • दो सबटास्क: broken_barh() मेथड से दो बार प्लॉट करें।
    • तीन सबटास्क: broken_barh() मेथड से तीन बार प्लॉट करें।
  3. बुनियादी समायोजन जोड़ें: y-अक्ष के टिक्स सेट करें और लेबल करें।
# 1
fig, ax = plt.subplots()

# 2
for index, row in df2.iterrows():
    if row['start_2'] is None:
        ax.barh(y=df2['task'], width=df2['task_duration_1'], left=df2['days_to_start_1'])
    elif row['start_2'] is not None and row['start_3'] is None:
        ax.broken_barh(xranges=[(row['days_to_start_1'], row['task_duration_1']), (row['days_to_start_2'], row['task_duration_2'])], yrange=(index + 1, 0.5))
    else:
        ax.broken_barh(xranges=[(row['days_to_start_1'], row['task_duration_1']), (row['days_to_start_2'], row['task_duration_2']), (row['days_to_start_3'], row['task_duration_3'])], yrange=(index + 1, 0.5))

# 3
ax.set_yticks([1.25, 2.25, 3.25, 4.25])
ax.set_yticklabels(df2['task'])

plt.show()

आउटपुट:

broken_barh() Gantt चार्ट

उपरोक्त कोड में, हम वास्तव में केवल एक सबटास्क वाले टास्क के लिए भी broken_barh() का उपयोग कर सकते हैं। इस स्थिति में, हमें इस कोड लाइन को:

ax.barh(y=df2['task'], width=df2['task_duration_1'], left=df2['days_to_start_1'])

इससे बदलना होगा:

ax.broken_barh(xranges=[(row['days_to_start_1'], row['task_duration_1'])], yrange=(index + 1, 0.5))

यह तरीका हमारे कोड को अधिक एकरूप और पठनीय भी बनाएगा।

Matplotlib में Gantt चार्ट को कैसे कस्टमाइज़ करें

आइए अपने शुरुआती डेटाफ़्रेम पर लौटें:

print(df)

आउटपुट:

  task        team      start        end  completion_frac  days_to_start  \
0     A         R&D 2022-10-20 2022-10-31             1.00              0  
1     B  Accounting 2022-10-24 2022-10-28             1.00              4  
2     C       Sales 2022-10-26 2022-10-31             1.00              6  
3     D       Sales 2022-10-31 2022-11-08             1.00             11  
4     E          IT 2022-11-03 2022-11-09             1.00             14  
5     F         R&D 2022-11-07 2022-11-18             0.95             18  
6     G          IT 2022-11-10 2022-11-17             0.70             21  
7     H       Sales 2022-11-14 2022-11-22             0.35             25  
8     I  Accounting 2022-11-18 2022-11-23             0.10             29  
9     J  Accounting 2022-11-23 2022-12-01             0.00             34  
10    K       Sales 2022-11-28 2022-12-05             0.00             39  
11    L          IT 2022-11-30 2022-12-05             0.00             41  

    days_to_end  task_duration  completion_days 
0            11             12            12.00 
1             8              5             5.00 
2            11              6             6.00 
3            19              9             9.00 
4            20              7             7.00 
5            29             12            11.40 
6            28              8             5.60 
7            33              9             3.15 
8            34              6             0.60 
9            42              9             0.00 
10           46              8             0.00 
11           46              6             0.00 

और अपने पहले Gantt चार्ट पर:

plt.barh(y=df['task'], width=df['task_duration'], left=df['days_to_start'])
plt.show()

आउटपुट:

Matplotlib में Gantt चार्ट

विशेष रूप से, हम इस चार्ट में कुछ कस्टमाइज़ेशन जोड़ना चाहते हैं ताकि यह अधिक सूचनाप्रद हो।

matplotlib के साथ प्लॉट कस्टमाइज़िंग में और गहराई से जाने के लिए, ये संसाधन देखें: Matplotlib Tutorial: Python Plotting और Matplotlib Cheat Sheet: Plotting in Python।

बुनियादी Gantt चार्ट समायोजन

इनमें शामिल हैं:

  • प्लॉट शीर्षक जोड़ना
  • अक्षों को समायोजित और कस्टमाइज़ करना
  • ग्रिड जोड़ना

प्लॉट शीर्षक जोड़ना

एक अर्थपूर्ण शीर्षक किसी भी प्लॉट, जिसमें Gantt चार्ट भी शामिल है, के लिए आवश्यक है। मान लें कि हमारा प्रोजेक्ट 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()

आउटपुट:

Gantt चार्ट Matplotlib प्लॉट शीर्षक

अक्षों को समायोजित और कस्टमाइज़ करना तथा ग्रिड जोड़ना

इस चरण में, हम पिछले कोड पर आगे बढ़ेंगे और निम्न कार्य करेंगे:

  1. ax ऑब्जेक्ट के साथ काम करने के लिए सबप्लॉट्स सहित एक फ़िगर बनाएं।
  2. y-अक्ष को उलट दें ताकि सभी टास्क ऊपर से नीचे कालानुक्रमिक क्रम में हों।
  3. x-टिक्स के उपयुक्त स्थान तय करें।
    • मान लें कि हम x-टिक्स हर सोमवार को रखना चाहते हैं, यह ध्यान में रखते हुए कि Project X गुरुवार को शुरू हुआ था।
    • चार्ट में भीड़भाड़ से बचने के लिए हम केवल मेजर टिक्स चुनते हैं।
  4. उचित x-टिक लेबल और उनका फ़ॉर्मेट तय करें।
    • फिर से, ध्यान रहे कि Project X गुरुवार को शुरू हुआ था, और हमें केवल सोमवारों को लेबल करना है।
    • क्योंकि Project X पूरी तरह 2022 से संबंधित है, हमें हर तारीख के साथ वर्ष निर्दिष्ट करने की आवश्यकता नहीं है।
    • यह सुनिश्चित करना महत्वपूर्ण है कि x-टिक्स और x-टिक लेबल की संख्या समान हो।
  5. x-टिक्स और x-टिक लेबल जोड़ें।
  6. वर्टिकल ग्रिड जोड़ें।
# 1
fig, ax = plt.subplots()

plt.barh(y=df['task'], width=df['task_duration'], left=df['days_to_start'] + 1)
plt.title('Project Management Schedule of Project X', fontsize=15)

# 2
plt.gca().invert_yaxis()

# 3
xticks = np.arange(5, df['days_to_end'].max() + 2, 7)

# 4
xticklabels = pd.date_range(start=df['start'].min() + dt.timedelta(days=4), end=df['end'].max()).strftime("%d/%m")
# 5
ax.set_xticks(xticks)
ax.set_xticklabels(xticklabels[::7])

# 6
ax.xaxis.grid(True, alpha=0.5)

plt.show()

आउटपुट:

Gantt चार्ट कस्टम अक्ष

यदि आपको Python का अभ्यास चाहिए ताकि आप कोई भी Python कोड आसानी से लिख और पढ़ सकें, हमारा Intermediate Python कोर्स एक अच्छा संदर्भ है।

टीम के अनुसार टास्क को रंगना

अब, प्रत्येक बार (जो किसी विशिष्ट टास्क का प्रतिनिधित्व करता है) को उस टीम के अनुरूप रंग-कोड करें जिसे यह टास्क सौंपा गया था। इसके लिए, हम निम्न करेंगे:

  1. टीम नामों को कुंजी और बेस matplotlib रंगों को मान के रूप में लेकर एक डिक्शनरी बनाएं।
  2. सबप्लॉट्स सहित एक फ़िगर बनाएं।
  3. डेटाफ़्रेम की पंक्तियों पर इटररेट करें, प्रत्येक पंक्ति के लिए एक बार बनाएं और टीम के अनुरूप रंग जोड़ें।
  4. वे सभी बुनियादी समायोजन जोड़ें जो हमने पहले लागू किए थे।
# 1
team_colors = {'R&D': 'c', 'Accounting': 'm', 'Sales': 'y', 'IT': 'b'}

# 2
fig, ax = plt.subplots()

# 3
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']])

# 4
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)
plt.show()

आउटपुट:

टीम के अनुसार रंगे गए टास्क वाला Gantt चार्ट

लीजेंड जोड़ना

ऊपर दिए गए Gantt चार्ट उदाहरण में एक चीज़ की कमी है – कौन-सा रंग किस टीम से संबंधित है, यह बताने वाला लीजेंड। इसे ठीक करने के लिए, हम पैचेस बनाएंगे – पूर्व-परिभाषित रंग से भरे matplotlib 2D आर्टिस्ट ऑब्जेक्ट। हम matplotlib.patches.Patch क्लास का उपयोग करके प्रत्येक टीम के लिए, उपयुक्त रंग में, पैचेस की सूची बनाएंगे:

patches = []
for team in team_colors:
    patches.append(matplotlib.patches.Patch(color=team_colors[team]))

अब, हम अपने चार्ट में लीजेंड जोड़ने के लिए तैयार हैं:

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()

आउटपुट:

लीजेंड वाला Gantt चार्ट

उपरोक्त Gantt चार्ट उदाहरण अब कहीं अधिक जानकारीपूर्ण दिखता है।

Python में अपनी प्लॉट की सौंदर्यशास्त्र और पठनीयता को बेहतर बनाने की और तकनीकें आप Improving Your Data Visualizations in Python कोर्स में पाएंगे।

पूर्णता की स्थिति जोड़ना

अब तक, हमने उस completion_days column का उपयोग नहीं किया है जिसे हमने इस ट्यूटोरियल की शुरुआत में निकाला था। अब हम इसे उपयोग करेंगे ताकि अपने Gantt चार्ट को अधिक सूचनाप्रद बना सकें और दिखा सकें कि प्रत्येक टास्क किस चरण में है।

तकनीकी रूप से, हम पहले से बने प्रत्येक बार के ऊपर एक और बार जोड़ेंगे। निचला बार प्रत्येक टास्क की कुल अवधि (आवंटित दिनों में) को दर्शाएगा, जबकि ऊपर वाला उसी टास्क की पूर्णता स्थिति (आवंटित दिनों में) को दिखाएगा। 

प्रत्येक टास्क के लिए, दोनों बार संबंधित टीम के समान रंग के होंगे, लेकिन निचला बार ऊपरी बार से हल्का होगा ताकि उनके बीच का अंतर दिख सके।

दूसरे शब्दों में, यदि कोई टीम किसी टास्क पर बेहतर प्रदर्शन कर रही है, तो इन दो बार का संयोजन यह दर्शाएगा मानो टीम ने उस टास्क पर अपेक्षा से अधिक दिन काम कर लिया है (अर्थात संभवतः टास्क समय सीमा से पहले पूरा हो जाएगा)। 

विपरीत स्थिति में, यदि कोई टीम किसी टास्क पर कम प्रदर्शन कर रही है, तो संबंधित बार यह दिखाएंगे मानो टीम ने उस टास्क पर अपेक्षा से कम दिन काम किया है (अर्थात टास्क संभवतः समय सीमा के बाद पूरा होगा)।

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()

आउटपुट:

पूर्णता की स्थिति वाला Gantt चार्ट

ऊपर दिए गए प्लॉट से दिखता है कि टीमें अपने टास्क पूरे करने में एक-सी गति से नहीं चल रहीं, जो कई वास्तविक प्रोजेक्ट्स में सामान्य है। इस प्लॉट से और जानकारी पाने के लिए, मान लें कि वर्तमान तारीख 17 नवंबर 2022 है और इस तारीख को अपने चार्ट पर चिह्नित करें:

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()

आउटपुट:

वर्तमान तारीख वाला Gantt चार्ट

Project X की वर्तमान स्थिति के बारे में हम निम्न टिप्पणियां कर सकते हैं:

  • R&D टीम टास्क F पर बेहतर प्रदर्शन कर रही है और संभवतः इसे समय सीमा से पहले पूरा कर लेगी।
  • IT टीम टास्क G में विलंब में है और शायद उसे कुछ सहायता की आवश्यकता है।
  • Sales टीम टास्क H पर अनुसूची के अनुसार काम कर रही है।
  • Accounting टीम ने टास्क I को प्रोजेक्ट अनुसूची से पहले शुरू किया।

ऐसी टिप्पणियां टीम लीडर्स और प्रोजेक्ट मैनेजर को प्रोजेक्ट अनुसूची को समायोजित करने और आवश्यक संसाधन समय पर आवंटित करने में मदद कर सकती हैं ताकि डिलीवेरेबल्स में देरी से बचा जा सके।

अन्य संभावित समायोजन

हम अपने matplotlib Gantt चार्ट में और विवरण जोड़ सकते हैं। उदाहरण के लिए:

  • प्रत्येक बार पर टास्क पूर्णता का प्रतिशत जोड़ना।
  • कुछ टास्क को सबटास्क में विभाजित करना (तकनीकी तौर पर इसे कैसे करना है, हम पहले चर्चा कर चुके हैं)।
  • संबद्ध टास्क को एनोटेट करना।
  • महत्वपूर्ण माइलस्टोन और डेडलाइन चिह्नित करना।
  • वीकेंड और छुट्टियां हाईलाइट करना।
  • बार्स को टीम या टास्क प्रकार के आधार पर सॉर्ट करना।
  • x-अक्ष पर माइनर टिक्स जोड़ना ताकि सूचना की सूक्ष्मता बढ़े।
  • प्लॉट के समग्र फ़ॉर्मैटिंग और लेआउट में सुधार करना।

हालांकि, यह महत्वपूर्ण है कि हम अपने Gantt चार्ट को साफ-सुथरा रखें और उसे बहुत अधिक विवरणों से अव्यवस्थित न करें। अन्य किसी भी डेटा विज़ुअलाइज़ेशन की तरह, हमें प्लॉट की सूचना क्षमता और उसकी पठनीयता के बीच, साथ ही उस प्लॉट को बनाने के लिए उपयोग किए गए कोड की पठनीयता के बीच आवश्यक संतुलन बनाए रखना होता है।

Matplotlib के साथ Python में अपना Gantt चार्ट बनाना शुरू करें

सारांश के रूप में, इस ट्यूटोरियल में, हमने देखा:

  • Gantt चार्ट क्या होता है
  • यह किस प्रकार की जानकारी दिखाता है
  • इसे कब इस्तेमाल किया जाता है
  • matplotlib के साथ Gantt चार्ट बनाने के अलग-अलग तरीके और बारीकियां
  • matplotlib के साथ Python में Gantt चार्ट कैसे बनाया जाए 
  • इसे और अधिक सूचनाप्रद बनाने के लिए आगे कैसे समायोजित किया जाए
  • अंतिम परिणाम की व्याख्या कैसे करें। 

इसके अलावा, हमने विभिन्न Gantt चार्ट उदाहरण और उन्हें बनाने की चरण-दर-चरण प्रक्रिया भी देखी।

Python में प्रभावशाली और जानकारीपूर्ण चार्ट बनाना सीखने के लिए एक अधिक एकीकृत दृष्टिकोण हेतु, हमारा Data Visualization with Python स्किल ट्रैक देखें।

विषय