Как построить наложенную / наложенную диаграмму Ганта с другой горизонтальной гистограммой из другого фрейма данных в Python, используя matplotlib? - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь наложить существующую диаграмму Ганта на другую горизонтальную гистограмму, но мне не нужен столбчатый график с накоплением. Я видел Как построить наложенную гистограмму с помощью matplotlib в python? , и я хочу добиться аналогичного результата, но я не могу понять, как реализовать это в моем коде.

У меня есть два csv файла с разными данными, и мой текущий график использует только одну из таблиц. Я хочу использовать вторую таблицу для построения наложенной гистограммы, которая будет представлять Actual time, потраченные на операцию. Две таблицы могут быть связаны столбцом Operation/Activity, так как каждая из операций уникальна.

Поскольку фактическое время может быть меньше или больше запланированного времени, я хочу, чтобы наложенный линейный график имел различный цвет и разную ширину, чтобы его было легко заметить на «запланированной» панели (аналогично на что они есть по ссылке выше). Вот мое текущее изображение: Текущий график

Вот мой текущий код, который строит диаграмму Ганта, представляющую запланированное расписание:

import pandas as pd
from datetime import datetime
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
%matplotlib inline
import math
import time

df = pd.read_csv('zpp00141_new.csv')

#convert times to number to calculate
def timestr_to_num(timestr):
    return mdates.date2num(datetime.strptime('0' + timestr if timestr[1] == ':' else timestr, '%I:%M:%S %p'))

#rename the columns to fit start'finish attributes
df.rename(columns={"Earl. start / time": "start", "Latest finish / time": "finish"}, inplace = True)

#convert Operation# datatype from float to str and get rid of the trailing zeros
df['Operation/Activity'] = df['Operation/Activity'].astype(str).replace('\.0', '', regex=True)

#drop the rows with NaN values from the 'start' column
df.dropna(subset=['start'], inplace=True)
plt.style.use('ggplot')
#gantt chart plotting
fig, ax = plt.subplots(figsize=(12.5, 5))
operations = pd.unique(df['Operation/Activity'])
#opr_txt = pd.unique(df['Operation short text'])
#colors = plt.cm.tab10.colors  # get a list of 10 colors
cmap = plt.cm.get_cmap('plasma_r')
colors = [cmap(i/20) for i in range(20)]
#colors *= math.ceil(len(operations) / (len(colors)))  # repeat the list as many times as needed
for operation, color in zip(operations, colors):
    for row in df[df['Operation/Activity'] == operation].itertuples():
        left = timestr_to_num(row.start)
        right = timestr_to_num(row.finish)
        ax.barh(operation, left=left, width=right - left, height=1, color=color, label = operation)
ax.set_xlim(timestr_to_num('07:00:00 AM'), timestr_to_num('4:30:00 PM'))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))  # display ticks as hours and minutes
ax.xaxis.set_major_locator(mdates.HourLocator(interval=1))  # set a tick every hour
ax.set_xlabel('Time')
ax.set_ylabel('Operation')
plt.tight_layout()
ax.set_yticklabels(list(df['Operation/Activity'] + " - " + df['Operation short text'].astype(str)))
plt.title("Schedule")
#convert "now" time to a certain format of hours:minutes:seconds am/pm
now = datetime.now()
now = now.strftime('%I:%M:%S %p')
plt.axvline(x=timestr_to_num(now),color='r', animated = True)
plt.show()

Вот мой первый кадр данных (zpp00141_new .csv) где первая строка является заголовком:

Operation short text,Operation/Activity,Earl. start / time,Latest finish / time
Mount right racks,0250,7:00:00 AM,9:22:00 AM
Mount right side motion unit carriage,0251,9:22:00 AM,10:30:00 AM
Mount left side motion unit carriage,0252,10:30:00 AM,11:17:00 AM
Install motion unit complete,0253,11:17:00 AM,1:01:00 PM
Move machine to next step + EPA,0254,1:01:00 PM,3:30:00 PM
Mount Left Racks,0200,7:00:00 AM,9:12:00 AM
Mount cable motor & Lubricate guide carr,0201,9:12:00 AM,9:44:00 AM
Mount suction components,0202,9:44:00 AM,11:04:00 AM
Mount extraction,0203,11:04:00 AM,12:34:00 PM
Mount temporary diamond plates,0204,12:34:00 PM,1:04:00 PM
Mount piping inside,0205,1:04:00 PM,1:44:00 PM
Move Machine to next step + EPA,0206,1:44:00 PM,3:30:00 PM

Вот мой второй кадр данных, который я пытаюсь добавить к своему текущему графику:

Work center,Operation/Activity,Operation short text,Actual finish (time),Actual start (time)
503AL302,0201,Mount cable motor & Lubricate guide carr,10:22:26 AM,9:32:41 AM
503AL302,0202,Mount suction components,2:21:41 PM,10:23:03 AM
503AL302,0203,Mount extraction,2:22:58 PM,2:22:26 PM
503AL302,0204,Mount temporary diamond plates,2:24:28 PM,2:24:00 PM
503AL302,0250,Mount right racks,9:34:26 AM,6:02:45 AM
503AL302,0251,Mount right side motion unit carriage,10:50:17 AM,9:35:47 AM
503AL302,0253,Install motion unit complete,2:02:47 PM,12:28:33 PM
503AL302,0254,Move machine to next step + EPA,2:14:35 PM,2:02:58 PM
503AL302,0200,Mount Left Racks,9:30:59 AM,7:02:30 AM
503AL302,0205,Mount piping inside,2:25:23 PM,2:24:51 PM
503AL302,0206,Move Machine to next step + EPA,4:12:31 PM,2:26:39 PM
503AL302,0252,Mount left side motion unit carriage,12:28:22 PM,10:51:01 AM
...