import pandas as pd
from datetime import datetime
import matplotlib.dates as dates
import matplotlib.pyplot as plt
def gantt_chart(df_phase):
# Now convert them to matplotlib's internal format...
df_phase['Start Time'] = pd.to_datetime(df_phase['Start Time'], format='%Y-%m-%d %H:%M:%S.%f')
df_phase['End Time'] = pd.to_datetime(df_phase['End Time'], format='%Y-%m-%d %H:%M:%S.%f')
#Convert DF columns into lists, plt will take all values in scalar or list
sdate = df_phase['Start Time'].tolist()
edate = df_phase['End Time'].tolist()
plugin = df_phase['Plugin'].tolist()
status = df_phase['Status'].tolist()
color = []
#Store colors for success and failure to differentiate
for i in range(0, len(status)):
if status[i] == 'Success':
color.append('green')
else:
color.append('red')
#Convert time to Matplotlib number format
edate, sdate = [dates.date2num(item) for item in (edate, sdate)]
ypos = range(len(plugin))
fig, ax = plt.subplots()
time_diff = edate - sdate
# Plot the data, color is scalar or a list
# All are in form of list
ax.barh(ypos, time_diff, left=sdate, linewidth = 0.5, height=0.8, align='center', color=color)
plt.yticks(ypos, plugin)
plt.xticks(rotation=-20)
ax.axis('tight')
# We need to tell matplotlib that these are dates...
ax.xaxis_date()
plt.ylabel('Plugins', fontsize='medium', stretch = 'normal')
# bbox_inches='tight' will prevent cutting of y-label
fig.savefig(image_file, bbox_inches='tight')
plt.show()
data = [['A', '2019-06-27 18:33:58.033', '2019-06-27 19:54:04.658', 'Success'], ['B', '2019-06-27 19:54:04.957', '2019-06-27 19:58:14.570', 'Success'], ['C', '2019-06-27 19:54:04.963', '2019-06-27 19:54:19.928', 'Failed']]
df_phase = pd.DataFrame(data, columns = [Plugin, 'Start Time', 'End Time', 'Status'])
#Calling the function
gantt_chart(df_phase)
Note: This is authored my me only, you can find it on my blog.