diff --git a/draw.py b/draw.py index a744a92..739ae61 100644 --- a/draw.py +++ b/draw.py @@ -1,5 +1,6 @@ import matplotlib.pyplot as plt import matplotlib.ticker as ticker +from matplotlib.ticker import FuncFormatter import numpy as np import pandas as pd import os @@ -7,7 +8,6 @@ import seaborn as sns import json from matplotlib.colors import LinearSegmentedColormap - def read_data(file_name: str): with open(file_name, 'r') as f: data = json.load(f) @@ -15,25 +15,43 @@ def read_data(file_name: str): for subkey, subvalue in value.items(): data[key][subkey] = float(subvalue) df = pd.DataFrame.from_dict(data, orient='index') + df = df.T df.index = pd.to_numeric(df.index) df.columns = pd.to_numeric(df.columns) return df -def draw_results(results, filename, title, annot_benefit=False, figure_size=(10, 10)): - df= results +def draw_results(results, filename, title_benefit, annot_benefit=False, figure_size=(10, 10)): + df=results df = df.astype(float) df.index = df.index / 1000 + df.index = df.index.map(int) df.columns = df.columns / 1000 + df.columns = df.columns.map(int) min_value = df.min().min() max_value = df.max().max() max_scale = max(abs(min_value/1000), abs(max_value/1000)) - plt.figure(figsize=figure_size) + + df[df.columns[-1] + 1] = df.iloc[:, -1] + new_Data = pd.DataFrame(index=[df.index[-1] + 1], columns=df.columns) + for i in df.columns: + new_Data[i] = df[i].iloc[-1] + # print(new_Data) + df = pd.concat([df, new_Data]) + + X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0])) + + def fmt(x,pos): + return '{:.0f}'.format(x/1000) + cmap = sns.color_palette("coolwarm", as_cmap=True) + plt.figure(figsize=figure_size) ax = sns.heatmap(df/1000, fmt=".1f", cmap=cmap, vmin=-max_scale, vmax=max_scale, annot=annot_benefit) - ax.xaxis.set_major_formatter(ticker.FuncFormatter(lambda x, _: f"{x:.2f}")) - # ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1f')) - plt.title(title) + CS = ax.contour(X, Y, df, colors='black', alpha=0.5) + ax.clabel(CS, inline=True, fontsize=10, fmt=FuncFormatter(fmt)) + plt.title(title_benefit) plt.gca().invert_yaxis() + plt.xlim(0, df.shape[1] - 1) + plt.ylim(0, df.shape[0] - 1) plt.xlabel('ESS Capacity (MWh)') plt.ylabel('PV Capacity (MW)') plt.savefig(filename) @@ -41,43 +59,84 @@ def draw_results(results, filename, title, annot_benefit=False, figure_size=(10, def draw_cost(costs, filename, title_cost, annot_cost=False, figure_size=(10, 10)): df = costs df = df.astype(int) - print(df.index) df.index = df.index / 1000 - print(df.columns) + df.index = df.index.map(int) df.columns = df.columns / 1000 + df.columns = df.columns.map(int) + + df[df.columns[-1] + 1] = df.iloc[:, -1] + new_Data = pd.DataFrame(index=[df.index[-1] + 1], columns=df.columns) + for i in df.columns: + new_Data[i] = df[i].iloc[-1] + # print(new_Data) + df = pd.concat([df, new_Data]) + X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0])) + + def fmt(x, pos): + return '{:.0f}'.format(x / 1000000) plt.figure(figsize=figure_size) - sns.heatmap(df/1000000, fmt=".1f", cmap='viridis', annot=annot_cost) + ax = sns.heatmap(df/1000000, fmt=".1f", cmap='viridis', annot=annot_cost) + CS = ax.contour(X, Y, df, colors='black', alpha=0.5) + ax.clabel(CS, inline=True, fontsize=10, fmt=FuncFormatter(fmt)) plt.title(title_cost) plt.gca().invert_yaxis() + plt.xlim(0, df.shape[1] - 1) + plt.ylim(0, df.shape[0] - 1) plt.xlabel('ESS Capacity (MWh)') plt.ylabel('PV Capacity (MW)') - print(filename) plt.savefig(filename) + def draw_overload(overload_cnt, filename, title_unmet, annot_unmet=False, figure_size=(10, 10)): df = overload_cnt - df = df.astype(int) + df = (4 * 24 * 365 - df) / (4 * 24 * 365) + df = df.astype(float) df.index = df.index / 1000 + df.index = df.index.map(int) df.columns = df.columns / 1000 + df.columns = df.columns.map(int) + print('unmet index') + print(df.index) + print('unmet columns') + print(df.columns) min_value = df.min().min() max_value = df.max().max() - max_scale = max(abs(min_value/1000), abs(max_value/1000)) + # max_scale = max(abs(min_value/1000), abs(max_value/1000)) + + + df[df.columns[-1] + 1] = df.iloc[:, -1] + new_Data = pd.DataFrame(index=[df.index[-1] + 1], columns=df.columns) + for i in df.columns: + new_Data[i] = df[i].iloc[-1] + # print(new_Data) + df = pd.concat([df, new_Data]) + plt.figure(figsize=figure_size) cmap = LinearSegmentedColormap.from_list("", ["white", "blue"]) - ax = sns.heatmap(df/(4*24*365), fmt=".00%", cmap=cmap, vmin=0, vmax=1, annot=annot_unmet) + ax = sns.heatmap(df, fmt=".00%", cmap=cmap, vmin=0, vmax=1, annot=annot_unmet) + cbar = ax.collections[0].colorbar cbar.set_ticks([0, 0.25, 0.5, 0.75, 1]) cbar.set_ticklabels(['0%', '25%', '50%', '75%', '100%']) cbar.ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: f'{x:.0%}')) + X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0])) + def fmt(x, pos): + return '{:.0f}%'.format(x * 100) + CS = ax.contour(X, Y, df, colors='black', alpha=0.5) + + ax.clabel(CS, inline=True, fontsize=10, fmt=FuncFormatter(fmt)) + + plt.xlim(0, df.shape[1] - 1) + plt.ylim(0, df.shape[0] - 1) plt.title(title_unmet) - plt.gca().invert_yaxis() plt.xlabel('ESS Capacity (MWh)') plt.ylabel('PV Capacity (MW)') plt.savefig(filename) + directory = 'data/' file_list = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))] @@ -99,19 +158,19 @@ overload_dfs = [read_data(directory + '-'.join(f)) for f in overload_files] results_dfs = [read_data(directory + '-'.join(f)) for f in results_files] for costs_df, overload_df, results_df in zip(costs_dfs, overload_dfs, results_dfs): - # print(costs_df.index) - # print(pd.to_numeric(costs_df.columns)) - # costs_df.index = pd.to_numeric(costs_df.columns ) - # costs_df.columns = pd.to_numeric(costs_df.index) - print(costs_df) - draw_cost(costs_df, f'plots/costs-{int(costs_df.columns[-1])}.png', f'Costs for PV-{int(costs_df.columns[-1])}MW ESS-{int(costs_df.index[-1])}MWh', annot_cost=True) - # overload_df.index = pd.to_numeric(overload_df.columns, errors='coerce') - # overload_df.columns = pd.to_numeric(overload_df.columns, errors='coerce') - print(overload_df) - # draw_overload(overload_df, f'plots/overload-{overload_df.columns[-1]}', f'Overload for PV-{overload_df.columns[-1]}MW ESS-{overload_df.index[-1]}MWh', annot_unmet=True) - # results_df.index = pd.to_numeric(results_df.columns, errors='coerce') - # results_df.columns = pd.to_numeric(results_df.columns, errors='coerce') - # draw_results(results_df, f'plots/results-{results_df.columns[-1]}', f'Results for PV-{results_df.columns[-1]}MW ESS-{results_df.index[-1]}MWh', annot_benefit=True) + + draw_cost(costs_df, + f'plots/costs-{int(costs_df.columns[-1])}-pv-{int(costs_df.index[-1])}.png', + f'Costs for ESS-{int(costs_df.columns[-1])}-pv-{int(costs_df.index[-1])}MWh', annot_cost=False) + + draw_overload(overload_df, + f'plots/overload-ess-{overload_df.columns[-1]}-pv-{overload_df.index[-1]}.png', + f'Overload for ess-{overload_df.columns[-1]}MW pv-{overload_df.index[-1]}MWh', + annot_unmet=False) + + draw_results(results_df, + f'plots/results-{results_df.columns[-1]}-pv-{results_df.index[-1]}.png', + f'Results for ess-{results_df.columns[-1]}MW pv-{results_df.index[-1]}MWh', annot_benefit=False)