diff --git a/Code/MonoMutliViewClassifiers/ResultAnalysis.py b/Code/MonoMutliViewClassifiers/ResultAnalysis.py index 883e7e0ece1e453556b2b455d97f97d36d613350..720071c1fb5b535f1be0d2ce2e8d48ac3837456e 100644 --- a/Code/MonoMutliViewClassifiers/ResultAnalysis.py +++ b/Code/MonoMutliViewClassifiers/ResultAnalysis.py @@ -42,7 +42,7 @@ def genNamesFromRes(mono, multi): return names -def resultAnalysis(benchmark, results, name, times, metrics, directory): +def resultAnalysis(benchmark, results, name, times, metrics, directory, minSize=10): mono, multi = results for metric in metrics: names = genNamesFromRes(mono, multi) @@ -55,30 +55,27 @@ def resultAnalysis(benchmark, results, name, times, metrics, directory): validationScores = np.array(validationScores) trainScores = np.array(trainScores) names = np.array(names) - - f = pylab.figure(figsize=(40, 30)) - width = 0.35 # the width of the bars - fig = plt.gcf() - fig.subplots_adjust(bottom=105.0, top=105.01) - ax = f.add_axes([0.1, 0.1, 0.8, 0.8]) - if metric[1] is not None: - metricKWARGS = dict((index, metricConfig) for index, metricConfig in enumerate(metric[1])) - else: - metricKWARGS = {} + size = nbResults + if nbResults < minSize: + size = minSize + figKW = {"figsize" : (size, 3.0/4*size+2.0)} + f, ax = plt.subplots(nrows=1, ncols=1, **figKW) + barWidth= 0.35 sorted_indices = np.argsort(validationScores) validationScores = validationScores[sorted_indices] trainScores = trainScores[sorted_indices] names = names[sorted_indices] - ax.set_title(getattr(Metrics, metric[0]).getConfig(**metricKWARGS) + " on validation set for each classifier") - rects = ax.bar(range(nbResults), validationScores, width, color="r", ) - rect2 = ax.bar(np.arange(nbResults) + width, trainScores, width, color="0.7", ) + ax.set_title(metric[0] + "\n on validation set for each classifier") + rects = ax.bar(range(nbResults), validationScores, barWidth, color="r", ) + rect2 = ax.bar(np.arange(nbResults) + barWidth, trainScores, barWidth, color="0.7", ) autolabel(rects, ax) autolabel(rect2, ax) ax.legend((rects[0], rect2[0]), ('Test', 'Train')) - ax.set_xticks(np.arange(nbResults) + width) + ax.set_ylim(-0.1, 1.1) + ax.set_xticks(np.arange(nbResults) + barWidth) ax.set_xticklabels(names, rotation="vertical") - + plt.tight_layout() f.savefig(directory + time.strftime("%Y%m%d-%H%M%S") + "-" + name + "-" + metric[0] + ".png") plt.close() @@ -94,7 +91,8 @@ def analyzeLabels(labelsArrays, realLabels, results, directory): for classifierIndex in range(nbClassifiers): for iterIndex in range(nbIter): data[:, classifierIndex * nbIter + iterIndex] = tempData[classifierIndex, :] - fig = pylab.figure(figsize=(10, 20)) + figKW = {"figsize":(nbClassifiers/2, nbExamples/20)} + fig, ax = plt.subplots(nrows=1, ncols=1, **figKW) cmap = mpl.colors.ListedColormap(['red', 'green']) bounds = [-0.5, 0.5, 1.5] norm = mpl.colors.BoundaryNorm(bounds, cmap.N) @@ -106,11 +104,12 @@ def analyzeLabels(labelsArrays, realLabels, results, directory): plt.xticks(ticks, labels, rotation="vertical") cbar = fig.colorbar(cax, ticks=[0, 1]) cbar.ax.set_yticklabels(['Wrong', ' Right']) + fig.tight_layout() fig.savefig(directory + time.strftime("%Y%m%d-%H%M%S") + "-error_analysis.png") plt.close() -def genScoresNames(iterResults, metric, nbResults, names, nbMono): +def genScoresNames(iterResults, metric, nbResults, names, nbMono, minSize=10): nbIter = len(iterResults) validationScores = np.zeros((nbIter, nbResults)) trainScores = np.zeros((nbIter, nbResults)) @@ -121,21 +120,16 @@ def genScoresNames(iterResults, metric, nbResults, names, nbMono): trainScores[iterIndex, :nbMono] = np.array([float(res[1][2][metric[0]][0]) for res in mono]) trainScores[iterIndex, nbMono:] = np.array([float(scores[metric[0]][0]) for a, b, scores, c in multi]) - # import pdb;pdb.set_trace() validationSTDs = np.std(validationScores, axis=0) trainSTDs = np.std(trainScores, axis=0) validationMeans = np.mean(validationScores, axis=0) trainMeans = np.mean(trainScores, axis=0) - - f = pylab.figure(figsize=(40, 30)) - width = 0.35 # the width of the bars - fig = plt.gcf() - fig.subplots_adjust(bottom=105.0, top=105.01) - ax = f.add_axes([0.1, 0.1, 0.8, 0.8]) - if metric[1] is not None: - metricKWARGS = dict((index, metricConfig) for index, metricConfig in enumerate(metric[1])) - else: - metricKWARGS = {} + size=nbResults + if nbResults<minSize: + size=minSize + figKW = {"figsize" : (size, 3.0/4*size+2.0)} + f, ax = plt.subplots(nrows=1, ncols=1, **figKW) + barWidth = 0.35 # the width of the bars sorted_indices = np.argsort(validationMeans) validationMeans = validationMeans[sorted_indices] validationSTDs = validationSTDs[sorted_indices] @@ -143,14 +137,16 @@ def genScoresNames(iterResults, metric, nbResults, names, nbMono): trainMeans = trainMeans[sorted_indices] names = np.array(names)[sorted_indices] - ax.set_title(getattr(Metrics, metric[0]).getConfig(**metricKWARGS) + " for each classifier") - rects = ax.bar(range(nbResults), validationMeans, width, color="r", yerr=validationSTDs) - rect2 = ax.bar(np.arange(nbResults) + width, trainMeans, width, color="0.7", yerr=trainSTDs) + ax.set_title(metric[0] + " for each classifier") + rects = ax.bar(range(nbResults), validationMeans, barWidth, color="r", yerr=validationSTDs) + rect2 = ax.bar(np.arange(nbResults) + barWidth, trainMeans, barWidth, color="0.7", yerr=trainSTDs) autolabel(rects, ax) autolabel(rect2, ax) + ax.set_ylim(-0.1, 1.1) ax.legend((rects[0], rect2[0]), ('Test', 'Train')) - ax.set_xticks(np.arange(nbResults) + width) + ax.set_xticks(np.arange(nbResults) + barWidth) ax.set_xticklabels(names, rotation="vertical") + f.tight_layout() return f