diff --git a/bloxplot_stats.py b/bloxplot_stats.py index 8a1c973..290860c 100644 --- a/bloxplot_stats.py +++ b/bloxplot_stats.py @@ -34,6 +34,8 @@ def plot(ax, path, color): ax.plot(range(1, len(scores)+1),scores, '.-', label=f"{path.split('/')[-1]}'s scores", color = color) ax.plot((1, len(scores)),(s_a(scores), s_a(scores)), '--', label=f"{path.split('/')[-1]}'s mean ({round(s_a(scores), 3)})", color = color) ax.plot((1, len(scores)),(mediana(scores), mediana(scores)), ':', label=f"{path.split('/')[-1]}'s mediana ({round(mediana(scores), 3)})", color = color) + + def boxplot(ax, path, color): scores =[] @@ -52,6 +54,44 @@ def boxplot(ax, path, color): if __name__ == '__main__': + + global_path = "/home/gestures/Easy_sim/dummy_simulation/stats/" + # 1. Name (Dima) + # 2. Name-Name (Dima-Elisey) + + DATA = {} # Name of creator - {} - Name of tester + + for dirname in sorted(os.listdir(global_path)): + dirpath = os.path.join(global_path, dirname) + if os.path.isdir(file_path): + data = [] + if not dirname.contains('-'): + name = dirname + if not name is DATA: + DATA[name] = {} + DATA[name][name] = data + else: + names = dirname.split('-') + name1 = names[0] + name2 = names[1] + if not name1 is DATA: + DATA[name1] = {} + DATA[name1][name2] = data + for filename in sorted(os.listdir(dirpath)): + file_path = os.path.join(dirpath, filename) + if file_path.endswith('.yaml'): + with open(file_path, 'r', encoding='utf-8') as file: + datafile = yaml.load(file, Loader = yaml.Loader) + # TODO change score to new formula + data.append(datafile['score']) + + + + + + + + fig, ax = plt.subplots() boxplot(ax, "/home/gestures/Easy_sim/dummy_simulation/stats/Dima", "limegreen") diff --git a/fullplot_stats.py b/fullplot_stats.py new file mode 100644 index 0000000..657cf64 --- /dev/null +++ b/fullplot_stats.py @@ -0,0 +1,164 @@ +import sys +import os +import yaml +import matplotlib.pyplot as plt +import numpy as np + + +def total_boxplot(DATA, creator = 'any', tester = 'any', simulation = "dummy simulation"): + + fig, ax = plt.subplots() + + data_to_plot = [] + labels = [] + title = f'Boxplot of scores in {simulation},' + xlabel = "" + + colors_list = plt.colormaps['tab10'].colors + + if creator == tester == 'any': + print(f"Warning: setting both creator and tester as 'any' plots only self testing!") + title += f" self testing" + xlabel = "self tester" + for creator_name, data in DATA.items(): + if creator_name in data: + data_to_plot.append(data[creator_name]) + labels.append(creator_name) + + elif creator == 'any': + title += f" tester: {tester}" + xlabel = "creator" + for creator_name, data in DATA.items(): + if tester in data: + data_to_plot.append(data[tester]) + #labels.append(f"{creator_name}-{tester}") + labels.append(creator_name) + + elif tester == 'any': + title += f" creator: {creator}" + xlabel = "tester" + if creator in DATA: + for tester_name, data in DATA[creator].items(): + data_to_plot.append(data) + #labels.append(f"{creator}-{tester}") + labels.append(tester_name) + + + if len(data_to_plot) == 0: + print("No appropriate data!") + return + + + #print(len(data_to_plot), len(labels)) + elements = ax.boxplot(data_to_plot, patch_artist=True, tick_labels=labels) + for i, patch in enumerate(elements['boxes']): + patch.set_facecolor(colors_list[(i)%10]) + + ax.grid() + #ax.legend() + ax.set(xlabel=xlabel, ylabel='Score') + ax.set_title(title) + + +def heat_map(DATA, criteria = np.median): + + names_to_nums = {name: num for num, name in enumerate(list(DATA.keys()))} + values = np.zeros( (len(names_to_nums)+1, len(names_to_nums)+1) ) + + testers = {} + for creator, Data in DATA.items(): + total_creator = [] + for tester, data in Data.items(): + if not tester in testers: + testers[tester] = [] + if creator in names_to_nums and tester in names_to_nums: + creator_idx = names_to_nums[creator] + tester_idx = names_to_nums[tester] + values[creator_idx, tester_idx] = criteria(data) + total_creator += data + testers[tester] +=data + values[creator_idx, len(names_to_nums)] = criteria(total_creator) + + for tester, data in testers.items(): + tester_idx = names_to_nums[tester] + values[len(names_to_nums), tester_idx] = criteria(data) + + fig, ax = plt.subplots() + im = ax.imshow(values, cmap='coolwarm') + + for i in range(values.shape[0]): + for j in range(values.shape[1]): + text = ax.text(j, i, round(values[i, j],1), ha="center", va="center", color="k") + + ax.set_xticks(range(len(DATA.keys())+1), labels=list(DATA.keys())+['mean'] ) + ax.set_yticks(range(len(DATA.keys())+1), labels=list(DATA.keys())+['mean'] ) + + ax.set(xlabel='tester', ylabel='creator') + ax.set_title("Cross-validation heatmap") + + +def convert_score(data): + + score = data['score'] + Nsof = len(data['exted_sofs']) + Ncol = len(data['collisions']) + Ksof = data['k_params']['_k_sof'] + Khp = data['k_params']['_k_hp'] + Kch = data['k_params']['_k_charge'] + Khp_max = 100 + Kch_max = 100 + + Kch_r = (score - Ksof*Nsof-Khp*(Khp_max-Ncol)/Khp_max) * Kch_max/Kch + + score_new = Ksof*Nsof*(Kch*Kch_r/Khp_max+Khp*(Khp_max-Ncol)/Khp_max) + #print(type(score_new)) + + return score_new + +if __name__ == '__main__': + + global_path = "/home/gestures6/Easy_sim/dummy_simulation/stats/" + # 1. Name (Dima) + # 2. Name-Name (Dima-Elisey) + + DATA = {} # Name of creator - {} - Name of tester + + for dirname in sorted(os.listdir(global_path)): + dirpath = os.path.join(global_path, dirname) + if os.path.isdir(dirpath) and not dirname.startswith('!'): + data = [] + if not '-' in dirname: + name = dirname + if not name in DATA: + DATA[name] = {} + DATA[name][name] = data + else: + names = dirname.split('-') + name1 = names[0] + name2 = names[1] + if not name1 in DATA: + DATA[name1] = {} + DATA[name1][name2] = data + for filename in sorted(os.listdir(dirpath)): + file_path = os.path.join(dirpath, filename) + if file_path.endswith('.yaml'): + with open(file_path, 'r', encoding='utf-8') as file: + datafile = yaml.load(file, Loader = yaml.Loader) + data.append(convert_score(datafile)) # TODO change score to new formula + #data.append(datafile['score']) + + + #for cr, data in DATA.items(): + #print(f"{cr}: {data}") + + total_boxplot(DATA, creator = 'any', tester = 'any') + + for name in DATA.keys(): + + total_boxplot(DATA, creator = name, tester = 'any') + total_boxplot(DATA, creator = 'any', tester = name) + + heat_map(DATA) + + plt.show() +