def GatherExperiments( folders, algo, window=40, title="", min_num_x=-1, timesteps=False, output_file="", ): """ Compute mean and standard error for several experiments and plot the learning curve :param folders: ([str]) Log folders, where the monitor.csv are stored :param window: (int) Smoothing window :param algo: (str) name of the RL algo :param title: (str) plot title :param min_num_x: (int) Minimum number of episode/timesteps to keep an experiment (default: -1, no minimum) :param timesteps: (bool) Plot timesteps instead of episodes :param y_limits: ([float]) y-limits for the plot :param output_file: (str) Path to a file where the plot data will be saved :param no_display: (bool) Set to true, the plot won't be displayed (useful when only saving plot) """ y_list = [] x_list = [] ok = False for folder in folders: if timesteps: x, y = loadData(folder, smooth=1, bin_size=100) if x is not None: x, y = np.array(x), np.array(y) else: x, y = loadEpisodesData(folder) if x is None or (min_num_x > 0 and y.shape[0] < min_num_x): printRed("Skipping {}".format(folder)) continue if y.shape[0] <= window: printYellow("Folder {}".format(folder)) printRed("Not enough episodes for current window size = {}".format( window)) continue ok = True y = movingAverage(y, window) y_list.append(y) print(len(x)) # Truncate x x = x[len(x) - len(y):] x_list.append(x) if not ok: printRed("Not enough data to plot anything with current config." + " Consider decreasing --min-x") return lengths = list(map(len, x_list)) min_x, max_x = np.min(lengths), np.max(lengths) print("Min x: {}".format(min_x)) print("Max x: {}".format(max_x)) for i in range(len(x_list)): x_list[i] = x_list[i][:min_x] y_list[i] = y_list[i][:min_x] x = np.array(x_list)[0] y = np.array(y_list) # if output_file != "": # printGreen("Saving aggregated data to {}.npz".format(output_file)) # np.savez(output_file, x=x, y=y) return x, y
def plotGatheredExperiments(folders, algo, y_limits, window=40, title="", min_num_x=-1, timesteps=False, output_file="", no_display=False): """ Compute mean and standard error for several experiments and plot the learning curve :param folders: ([str]) Log folders, where the monitor.csv are stored :param window: (int) Smoothing window :param algo: (str) name of the RL algo :param title: (str) plot title :param min_num_x: (int) Minimum number of episode/timesteps to keep an experiment (default: -1, no minimum) :param timesteps: (bool) Plot timesteps instead of episodes :param y_limits: ([float]) y-limits for the plot :param output_file: (str) Path to a file where the plot data will be saved :param no_display: (bool) Set to true, the plot won't be displayed (useful when only saving plot) """ y_list = [] x_list = [] ok = False for folder in folders: if timesteps: x, y = loadData(folder, smooth=1, bin_size=100) if x is not None: x, y = np.array(x), np.array(y) else: x, y = loadEpisodesData(folder) if x is None or (min_num_x > 0 and y.shape[0] < min_num_x): printYellow("Skipping {}".format(folder)) continue if y.shape[0] <= window: printYellow("Folder {}".format(folder)) printYellow( "Not enough episodes for current window size = {}".format( window)) continue ok = True y = movingAverage(y, window) y_list.append(y) # Truncate x x = x[len(x) - len(y):] x_list.append(x) if not ok: printRed("Not enough data to plot anything with current config." + " Consider decreasing --min-x") return lengths = list(map(len, x_list)) min_x, max_x = np.min(lengths), np.max(lengths) print("Min x: {}".format(min_x)) print("Max x: {}".format(max_x)) for i in range(len(x_list)): x_list[i] = x_list[i][:min_x] y_list[i] = y_list[i][:min_x] x = np.array(x_list)[0] y = np.array(y_list) printGreen("{} Experiments".format(y.shape[0])) print("Min, Max rewards:", np.min(y), np.max(y)) fig = plt.figure(title) # Compute mean for different seeds m = np.mean(y, axis=0) # Compute standard error s = np.squeeze(np.asarray(np.std(y, axis=0))) n = y.shape[0] plt.fill_between(x, m - s / np.sqrt(n), m + s / np.sqrt(n), color=lightcolors[0]) plt.plot(x, m, color=darkcolors[0], label=algo, linewidth=1) if timesteps: formatter = FuncFormatter(millions) plt.xlabel('Number of Timesteps') fig.axes[0].xaxis.set_major_formatter(formatter) else: plt.xlabel('Number of Episodes') plt.ylabel('Rewards') plt.title(title, **fontstyle) plt.ylim(y_limits) plt.legend(framealpha=0.5, labelspacing=0.01, loc='lower right', fontsize=16) if output_file != "": printGreen("Saving aggregated data to {}.npz".format(output_file)) np.savez(output_file, x=x, y=y) if not no_display: plt.show()