plots.py 2.70 KiB
import matplotlib.pyplot as plt
import numpy as np
from utils import parse_log
from datetime import datetime
import matplotlib

def plot_exec_log(exec_log,names=None,last_session=True):
    time, process_id, tag, msg, session = parse_log(exec_log)
    print(session)
    if last_session:
        time, process_id, tag, msg = time[session==max(session)], process_id[session==max(session)], tag[session==max(session)], msg[session==max(session)]
    events = msg[tag == 'EVENT']
    print(time)
    category, name, state, time = np.empty(events.shape[0]).astype(str), np.empty(events.shape[0]).astype(str), \
        np.empty(events.shape[0]).astype(str), np.empty(events.shape[0]).astype(str)

    for i, event in enumerate(events):
        # print(event.split("\t")[3])
        # print('o',datetime.strptime('2023-06-16 10:04:54.222336','%Y-%m-%d %H:%M:%S.%f'))
        category[i] = event.split("\t")[0]
        name[i] = event.split("\t")[1]
        state[i] = event.split("\t")[2]
        time[i] = event.split("\t")[3].replace('\n','') #datetime.strptime(event.split("\t")[3],'%Y-%m-%d %H:%M:%S.%f')
    time = time.astype(np.datetime64)
    state = state[time.argsort()]
    category = category[time.argsort()]
    name = name[time.argsort()]
    time = np.sort(time)

    if names is None:
        names = dict.fromkeys(np.unique(category))
        for cat in np.unique(category):
            names[cat] = np.array(np.unique(name[category == cat]))

    fig, axarr = plt.subplots(len(names.keys()),sharex=True)
    print(axarr)
    if not isinstance(axarr,np.ndarray):
        print('no')
        axarr = np.array([axarr])
    for i,cat in enumerate(names.keys()):
        print(cat)
        y=0
        for j,n in enumerate(names[cat]):
            cmap = matplotlib.cm.get_cmap('tab20')
            colors = [cmap(c/len(names[cat])) for c in range(len(names[cat]))]
            event_ids = np.where((name==n) & (category==cat))[0]
            y+=1
            axarr[i].set_title(cat)
            label=True
            for k,id in enumerate(event_ids[:-1]):
                # print(state[event_ids[k]])
                if state[event_ids[k]] == 'begin' and state[event_ids[k+1]] == 'end':
                    if label:
                        axarr[i].fill_betweenx([y,y+1],time[event_ids[k]],time[event_ids[k+1]],color=colors[j],label=n)
                        label=False
                    else:
                        axarr[i].fill_betweenx([y, y + 1], time[event_ids[k]], time[event_ids[k + 1]], color=colors[j])
        ylabels = names[cat]
        ylabelpos = np.arange(len(names[cat]))+1.5

        axarr[i].set_yticks(ylabelpos)
        axarr[i].set_yticklabels(ylabels)
        axarr[i].legend()
    plt.show()


plot_exec_log('logs/exec.log')