Quick Gantt Chart with Matplotlib

ProjectPlan_GANTT_CHart_MatplotlibThe problem: You need a quick Gantt chart for a quick proposal report and you dint have any project planner software installed.

Solution:

While there are many different ways, you only have access to python, well Here’s a simple Gantt chart plotter with just matplotlib.

Not for rigorous use but a good substitute to make quick Gantt plot for quick report.


"""
GANTT Chart with Matplotlib
Sukhbinder
Inspired from
Gantt Charts in Matplotlib
""" import datetime as dt import matplotlib.pyplot as plt import matplotlib.font_manager as font_manager import matplotlib.dates from matplotlib.dates import WEEKLY,MONTHLY, DateFormatter, rrulewrapper, RRuleLocator import numpy as np def _create_date(datetxt): """Creates the date""" day,month,year=datetxt.split('-') date = dt.datetime(int(year), int(month), int(day)) mdate = matplotlib.dates.date2num(date) return mdate def CreateGanttChart(fname): """ Create gantt charts with matplotlib Give file name. """ ylabels = [] customDates = [] try: textlist=open(fname).readlines() except: return # for tx in textlist: if not tx.startswith('#'): ylabel,startdate,enddate=tx.split(',') ylabels.append(ylabel.replace('\n','')) customDates.append([_create_date(startdate.replace('\n','')),_create_date(enddate.replace('\n',''))]) ilen=len(ylabels) pos = np.arange(0.5,ilen*0.5+0.5,0.5) task_dates = {} for i,task in enumerate(ylabels): task_dates[task] = customDates[i] fig = plt.figure(figsize=(20,8)) ax = fig.add_subplot(111) for i in range(len(ylabels)): start_date,end_date = task_dates[ylabels[i]] ax.barh((i*0.5)+0.5, end_date - start_date, left=start_date, height=0.3, align='center', edgecolor='lightgreen', color='orange', alpha = 0.8) locsy, labelsy = plt.yticks(pos,ylabels) plt.setp(labelsy, fontsize = 14) # ax.axis('tight') ax.set_ylim(ymin = -0.1, ymax = ilen*0.5+0.5) ax.grid(color = 'g', linestyle = ':') ax.xaxis_date() rule = rrulewrapper(WEEKLY, interval=1) loc = RRuleLocator(rule) #formatter = DateFormatter("%d-%b '%y") formatter = DateFormatter("%d-%b") ax.xaxis.set_major_locator(loc) ax.xaxis.set_major_formatter(formatter) labelsx = ax.get_xticklabels() plt.setp(labelsx, rotation=30, fontsize=10) font = font_manager.FontProperties(size='small') ax.legend(loc=1,prop=font) ax.invert_yaxis() fig.autofmt_xdate() plt.savefig('gantt.svg') plt.show() if __name__ == '__main__': fname=r"projectChart.txt" CreateGanttChart(fname)

Example of the project text file used by the above program is

Requirements/Design,04-01-2016,26-02-2016
Development,20-02-2016,27-03-2016
Test Planning,27-03-2016,3-04-2016
Testing,30-03-2016,30-04-2016
Bug Fixes,08-04-2016,15-05-2016
Documentation,15-04-2016,08-05-2016
Deployment,15-05-2016,25-05-2016
Final Report,8-05-2016,25-06-2016

9 thoughts on “Quick Gantt Chart with Matplotlib

    • day,month,year=datetxt.split(‘-‘)
      Traceback (most recent call last):
      File “”, line 1, in
      ValueError: need more than 1 value to unpack

      Like

  1. this is the text file i am using:
    Requirements/Design,04-01-2016,26-02-2016
    Development,20-02-2016,27-03-2016
    Test Planning,27-03-2016,3-04-2016
    Testing,30-03-2016,30-04-2016
    Bug Fixes,08-04-2016,15-05-2016
    Documentation,15-04-2016,08-05-2016
    Deployment,15-05-2016,25-05-2016
    Final Report,8-05-2016,25-06-2016

    Like

  2. i have tried 2 methods: 1. save the input as a txt file and feed it into the function _create_data; 2. feed str into the function. by using the 2nd method this is the error:

    datetxt=’Requirements/Design,04-01-2016,26-02-2016 Development,20-02-2016,27-03-2016 Test Planning,27-03-2016,3-04-2016 Testing,30-03-2016,30-04-2016 Bug Fixes,08-04-2016,15-05-2016 Documentation,15-04-2016,08-05-2016 Deployment,15-05-2016,25-05-2016 Final Report,8-05-2016,25-06-2016′
    >>> day,month,year=datetxt.split(‘-‘)
    Traceback (most recent call last):
    File “”, line 1, in
    ValueError: too many values to unpack

    Need help!!!!

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s