import os import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import matplotlib.ticker as ticker def binning(xs, ys, bins, reducer): binned_xs = np.arange(xs.min(), xs.max() + 1e-10, bins) binned_ys = [] for start, stop in zip([-np.inf] + list(binned_xs), binned_xs): left = (xs <= start).sum() right = (xs <= stop).sum() binned_ys.append(reducer(ys[left:right])) binned_ys = np.array(binned_ys) return binned_xs, binned_ys def plot_data(parent_dir, tag_filter="test/return", xaxis='step', value="AverageEpRet", condition="Condition1", smooth=1, bins=30000, xticks=5, yticks=5): # List to store all DataFrames data = [] # Traversing through each subfolder in the parent directory for subfolder in os.listdir(parent_dir): json_dir = os.path.join(parent_dir, subfolder) if not os.path.isdir(json_dir): continue # Read each JSON file separately for json_file in os.listdir(json_dir): if not json_file.endswith('.jsonl'): continue # Read the data from the JSON file df = pd.read_json(os.path.join(json_dir, json_file), lines=True) # Check if tag_filter exists in DataFrame if tag_filter not in df.columns: continue df = df[['step', tag_filter]].dropna().sort_values(by='step') # Apply binning xs, ys = binning(df['step'].to_numpy(), df[tag_filter].to_numpy(), bins, np.nanmean) # Replace original data with binned data df = pd.DataFrame({ 'step': xs, tag_filter: ys }) # Append the DataFrame to the list data.append(df) # Combine all DataFrames combined_df = pd.concat(data, ignore_index=True) # Plotting the combined DataFrame sns.set(style="white", font_scale=1.5) plot = sns.lineplot(data=combined_df, x=xaxis, y=tag_filter, errorbar='sd') ax = plot.axes ax.ticklabel_format(axis="x", scilimits=(5, 5)) steps = [1, 2, 2.5, 5, 10] ax.xaxis.set_major_locator(ticker.MaxNLocator(xticks, steps=steps)) ax.yaxis.set_major_locator(ticker.MaxNLocator(yticks, steps=steps)) xlim = [+np.inf, -np.inf] xlim = [min(xlim[0], xs.min()), max(xlim[1], xs.max())] ax.set_xlim(xlim) #plt.xlim([0, max]) #plt.legend(loc='best').set_draggable(True) plt.tight_layout(pad=0.5) plt.show() # Call the function plot_data('/media/vedant/cpsDataStorageWK/Vedant/tia_logs/dmc_cheetah_run_driving/tia/') exit() def plot_vanilla(parent_dir, tag_filter="train/return", smoothing=0.99): # List to store all EMAs emas = [] # Traversing through each subfolder in the parent directory for subfolder in os.listdir(parent_dir): json_dir = os.path.join(parent_dir, subfolder) if not os.path.isdir(json_dir): continue # Read each JSON file separately for json_file in os.listdir(json_dir): if not json_file.endswith('.jsonl'): continue # Read the data from the JSON file df = pd.read_json(os.path.join(json_dir, json_file), lines=True) # Check if tag_filter exists in DataFrame if tag_filter not in df.columns: continue df = df[['step', tag_filter]].sort_values(by='step') # Calculate exponential moving average for the smoothing value df['EMA'] = df[tag_filter].ewm(alpha=smoothing, adjust=False).mean() # Append the EMA DataFrame to the emas list emas.append(df) # Concatenate all EMAs into a single DataFrame and calculate mean and standard deviation all_emas = pd.concat(emas).groupby('step')['EMA'] mean_emas = all_emas.mean() std_emas = all_emas.std() # Plotting begins here sns.set_style("whitegrid", {'axes.grid' : True, 'axes.edgecolor':'black'}) fig = plt.figure() plt.clf() ax = fig.gca() # Plot mean and standard deviation of EMAs plt.plot(mean_emas.index, mean_emas, color='blue') plt.fill_between(std_emas.index, (mean_emas-std_emas), (mean_emas+std_emas), color='blue', alpha=.1) plt.xlabel('Training Episodes $(\\times10^6)$', fontsize=22) plt.ylabel('Average return', fontsize=22) lgd=plt.legend(frameon=True, fancybox=True, prop={'weight':'bold', 'size':14}, loc="best") #plt.title('Title', fontsize=14) ax = plt.gca() plt.setp(ax.get_xticklabels(), fontsize=16) plt.setp(ax.get_yticklabels(), fontsize=16) sns.despine() plt.tight_layout() plt.show() # Call the function plot_vanilla('/media/vedant/cpsDataStorageWK/Vedant/tia_logs/dmc_cheetah_run_driving/tia/') """ import os import pandas as pd import numpy as np import matplotlib.pyplot as plt # Set the path to the JSON file parent_dir = '/media/vedant/cpsDataStorageWK/Vedant/tia_logs/dmc_cheetah_run_driving/tia/' # Specific tag to filter tag_filter = "train/return" # Collect data from all JSON files data = [] # Smoothing values smoothing = 0.001 # Change num to set the number of smoothing values # List to store all EMAs emas = [] # Traversing through each subfolder in the parent directory for subfolder in os.listdir(parent_dir): json_dir = os.path.join(parent_dir, subfolder) if not os.path.isdir(json_dir): continue # Read each JSON file separately for json_file in os.listdir(json_dir): if not json_file.endswith('.jsonl'): continue # Read the data from the JSON file df = pd.read_json(os.path.join(json_dir, json_file), lines=True) # Check if tag_filter exists in DataFrame if tag_filter not in df.columns: continue df = df[['step', tag_filter]].sort_values(by='step') # Calculate exponential moving average for the smoothing value df['EMA'] = df[tag_filter].ewm(alpha=smoothing, adjust=False).mean() # Append the EMA DataFrame to the emas list emas.append(df) # Concatenate all EMAs into a single DataFrame and calculate mean and standard deviation all_emas = pd.concat(emas).groupby('step')['EMA'] mean_emas = all_emas.mean() std_emas = all_emas.std() # Plot mean and standard deviation of EMAs plt.figure(figsize=(10, 6)) plt.plot(mean_emas.index, mean_emas) plt.fill_between(std_emas.index, (mean_emas-std_emas), (mean_emas+std_emas), color='b', alpha=.1) plt.legend() plt.show() """