Source code for energy_demand.plotting.fig_cross_graphs

"""
"""
import numpy as np
from collections import defaultdict
import matplotlib.pyplot as plt

from energy_demand.profiles import load_factors
from energy_demand.plotting import basic_plot_functions
from energy_demand.plotting import plotting_styles

[docs]def plot_cross_graphs( base_yr, comparison_year, regions, ed_year_fueltype_regs_yh, reg_load_factor_y, fueltype_int, fueltype_str, fig_name, label_points, plotshow): result_dict = defaultdict(dict) # ------------------------------------------- # Get base year modelled demand # ------------------------------------------- for year, fuels in ed_year_fueltype_regs_yh.items(): if year == base_yr: for reg_nr, reg_geocode in enumerate(regions): result_dict['demand_by'][reg_geocode] = np.sum(fuels[fueltype_int][reg_nr]) result_dict['peak_h_demand_by'][reg_geocode] = np.max(fuels[fueltype_int][reg_nr]) # Demand across all regs result_dict['demand_by_all_regs'] = np.sum(fuels[fueltype_int]) # Peak demand fuel_all_reg_yh = np.sum(fuels[fueltype_int], axis=0)# Sum across all regions result_dict['peak_h_demand_by_all_regs'] = np.max(fuel_all_reg_yh) # Calculate national load factor fuel_all_fueltype_reg_yh = np.sum(fuels, axis=1)# Sum across all regions per fueltype load_factor_y = load_factors.calc_lf_y(fuel_all_fueltype_reg_yh) result_dict['lf_by_all_regs_av'] = load_factor_y[fueltype_int] elif year == comparison_year: for reg_nr, reg_geocode in enumerate(regions): result_dict['demand_cy'][reg_geocode] = np.sum(fuels[fueltype_int][reg_nr]) result_dict['peak_h_demand_cy'][reg_geocode] = np.max(fuels[fueltype_int][reg_nr]) # Demand across all regs result_dict['demand_cy_all_regs'] = np.sum(fuels[fueltype_int]) # Peak demand fuel_all_reg_yh = np.sum(fuels[fueltype_int], axis=0) # Sum across all regions result_dict['peak_h_demand_cy_all_regs'] = np.max(fuel_all_reg_yh) # Calculate national load factor fuel_all_fueltype_reg_yh = np.sum(fuels, axis=1)# Sum across all regions per fueltype load_factor_y = load_factors.calc_lf_y(fuel_all_fueltype_reg_yh) result_dict['lf_cy_all_regs_av'] = load_factor_y[fueltype_int] else: pass # Get load factor result_dict['lf_cy'] = {} result_dict['lf_by'] = {} for year, lf_fueltype_regs in reg_load_factor_y.items(): print("lf_fueltype_regs") print(lf_fueltype_regs.shape) if year == base_yr: for reg_nr, reg_geocode in enumerate(regions): result_dict['lf_by'][reg_geocode] = lf_fueltype_regs[fueltype_int][reg_nr] elif year == comparison_year: for reg_nr, reg_geocode in enumerate(regions): result_dict['lf_cy'][reg_geocode] = lf_fueltype_regs[fueltype_int][reg_nr] else: pass labels = [] #Base year x_values, y_values = [], [] x_values_0_quadrant, y_values_0_quadrant = [], [] x_values_1_quadrant, y_values_1_quadrant = [], [] x_values_2_quadrant, y_values_2_quadrant = [], [] x_values_3_quadrant, y_values_3_quadrant = [], [] for reg_nr, reg_geocode in enumerate(regions): # Change in load factor lf_change_p = ((100 / result_dict['lf_by'][reg_geocode]) * result_dict['lf_cy'][reg_geocode]) - 100 # Change in peak h deman demand_peak_h_p = ((100 / result_dict['peak_h_demand_by'][reg_geocode]) * result_dict['peak_h_demand_cy'][reg_geocode]) - 100 # Change in total regional demand tot_demand_p = ((100 / result_dict['demand_by'][reg_geocode]) * result_dict['demand_cy'][reg_geocode]) - 100 x_values.append(lf_change_p) #y_values.append(tot_demand_p) y_values.append(demand_peak_h_p) labels.append(reg_geocode) if lf_change_p < 0 and tot_demand_p > 0: x_values_0_quadrant.append(lf_change_p) y_values_0_quadrant.append(tot_demand_p) elif lf_change_p > 0 and tot_demand_p > 0: x_values_1_quadrant.append(lf_change_p) y_values_1_quadrant.append(tot_demand_p) elif lf_change_p > 0 and tot_demand_p < 0: x_values_2_quadrant.append(lf_change_p) y_values_2_quadrant.append(tot_demand_p) else: x_values_3_quadrant.append(lf_change_p) y_values_3_quadrant.append(tot_demand_p) # Add average national_tot_cy_p = ((100 / result_dict['lf_by_all_regs_av']) * result_dict['lf_cy_all_regs_av']) - 100 #national_tot_demand_p = ((100 / result_dict['demand_by_all_regs']) * result_dict['demand_cy_all_regs']) - 100 national_peak_h_p = ((100 / result_dict['peak_h_demand_by_all_regs']) * result_dict['peak_h_demand_cy_all_regs']) - 100 x_val_national_lf_demand_cy = [national_tot_cy_p] #y_val_national_lf_demand_cy = [national_tot_demand_p] y_val_national_lf_demand_cy = [national_peak_h_p] # ------------------------------------- # Plot # ------------------------------------- fig = plt.figure( figsize=basic_plot_functions.cm2inch(9, 8)) #width, height ax = fig.add_subplot(1, 1, 1) ax.scatter( x_values_0_quadrant, y_values_0_quadrant, alpha=0.6, color='rosybrown', s=8) ax.scatter( x_values_1_quadrant, y_values_1_quadrant, alpha=0.6, color='firebrick', s=8) ax.scatter( x_values_2_quadrant, y_values_2_quadrant, alpha=0.6, color='forestgreen', s=8) ax.scatter( x_values_3_quadrant, y_values_3_quadrant, alpha=0.6, color='darkolivegreen', s=8) # Add average ax.scatter( x_val_national_lf_demand_cy, y_val_national_lf_demand_cy, alpha=1.0, color='black', s=20, marker="v", linewidth=0.5, edgecolor='black', label='national') # -------- # Axis # -------- ax.set_xlabel("load factor change (%) {}".format(fueltype_str)) ax.set_ylabel("change in peak h (%) {}".format(fueltype_str)) plt.tick_params( axis='x', # changes apply to the x-axis which='both', # both major and minor ticks are affected bottom='on', # ticks along the bottom edge are off top='off', # ticks along the top edge are off labelbottom='on') # labels along the bottom edge are off # -------- # Grd # -------- ax.set_axisbelow(True) ax.set_xticks([0], minor=True) ax.set_yticks([0], minor=True) ax.yaxis.grid(True, which='minor', linewidth=0.7, color='grey', linestyle='--') ax.xaxis.grid(True, which='minor', linewidth=0.7, color='grey', linestyle='--') # Limit #plt.ylim(ymin=0) # ----------- # Labelling # ----------- if label_points: for pos, txt in enumerate(labels): ax.text( x_values[pos], y_values[pos], txt, horizontalalignment="right", verticalalignment="top", fontsize=6) # -------- # Legend # -------- '''legend( loc=3, prop={ 'family': 'arial', 'size': 8}, frameon=False)''' # Tight layout plt.margins(x=0) plt.tight_layout() plt.savefig(fig_name) if plotshow: plt.show() plt.close()
[docs]def plot_cross_graphs_scenarios( base_yr, comparison_year, regions, scenario_data, fueltype_int, fueltype_str, fig_name, label_points, plotshow): result_dict = defaultdict(dict) # ------------------------------------------- # Get base year modelled demand of any scenario (becasue base year the same in every scenario) # -------------------------------------------$ all_scenarios = list(scenario_data.keys()) first_scenario = all_scenarios[0] ed_year_fueltype_regs_yh = scenario_data[first_scenario]['ed_fueltype_regs_yh'] for year, fuels in ed_year_fueltype_regs_yh.items(): if year == base_yr: for reg_nr, reg_geocode in enumerate(regions): result_dict['demand_by'][reg_geocode] = np.sum(fuels[fueltype_int][reg_nr]) result_dict['peak_h_demand_by'][reg_geocode] = np.max(fuels[fueltype_int][reg_nr]) # Demand across all regs result_dict['demand_by_all_regs'] = np.sum(fuels[fueltype_int]) # Peak demand fuel_all_reg_yh = np.sum(fuels[fueltype_int], axis=0)# Sum across all regions result_dict['peak_h_demand_by_all_regs'] = np.max(fuel_all_reg_yh) # Calculate national load factor fuel_all_fueltype_reg_yh = np.sum(fuels, axis=1)# Sum across all regions per fueltype load_factor_y = load_factors.calc_lf_y(fuel_all_fueltype_reg_yh) result_dict['lf_by_all_regs_av'] = load_factor_y[fueltype_int] for scenario, data in scenario_data.items(): result_dict['demand_cy'][scenario] = {} result_dict['peak_h_demand_cy'][scenario] = {} for year, fuels in data['ed_fueltype_regs_yh'].items(): if year == comparison_year: for reg_nr, reg_geocode in enumerate(regions): result_dict['demand_cy'][scenario][reg_geocode] = np.sum(fuels[fueltype_int][reg_nr]) result_dict['peak_h_demand_cy'][scenario][reg_geocode] = np.max(fuels[fueltype_int][reg_nr]) # Demand across all regs result_dict['demand_cy_all_regs'][scenario] = np.sum(fuels[fueltype_int]) # Peak demand fuel_all_reg_yh = np.sum(fuels[fueltype_int], axis=0) # Sum across all regions result_dict['peak_h_demand_cy_all_regs'][scenario] = np.max(fuel_all_reg_yh) # Calculate national load factor fuel_all_fueltype_reg_yh = np.sum(fuels, axis=1)# Sum across all regions per fueltype load_factor_y = load_factors.calc_lf_y(fuel_all_fueltype_reg_yh) result_dict['lf_cy_all_regs_av'][scenario] = load_factor_y[fueltype_int] else: pass # Get load factor of base year reg_load_factor_y = scenario_data[first_scenario]['reg_load_factor_y'] for year, lf_fueltype_regs in reg_load_factor_y.items(): if year == base_yr: for reg_nr, reg_geocode in enumerate(regions): result_dict['lf_by'][reg_geocode] = lf_fueltype_regs[fueltype_int][reg_nr] for scenario, data in scenario_data.items(): reg_load_factor_y = scenario_data[scenario]['reg_load_factor_y'] result_dict['lf_cy'][scenario] = {} for year, lf_fueltype_regs in reg_load_factor_y.items(): if year == comparison_year: for reg_nr, reg_geocode in enumerate(regions): result_dict['lf_cy'][scenario][reg_geocode] = lf_fueltype_regs[fueltype_int][reg_nr] else: pass # -------------------------- # Iterate scenario and plot # -------------------------- fig = plt.figure( figsize=basic_plot_functions.cm2inch(18, 8)) #width, height ax = fig.add_subplot(1, 1, 1) color_list = plotting_styles.color_list_scenarios() marker_list = plotting_styles.marker_list() all_x_values = [] all_y_values = [] for scenario_nr, scenario in enumerate(all_scenarios): labels = [] x_values, y_values = [], [] for reg_nr, reg_geocode in enumerate(regions): # Change in load factor lf_change_p = ( (100 / result_dict['lf_by'][reg_geocode]) * result_dict['lf_cy'][scenario][reg_geocode]) - 100 # Change in peak h deman demand_peak_h_p = ( (100 / result_dict['peak_h_demand_by'][reg_geocode]) * result_dict['peak_h_demand_cy'][scenario][reg_geocode]) - 100 # Change in total regional demand tot_demand_p = ( (100 / result_dict['demand_by'][reg_geocode]) * result_dict['demand_cy'][scenario][reg_geocode]) - 100 x_values.append(lf_change_p) #y_values.append(tot_demand_p) y_values.append(demand_peak_h_p) #print("ADDING {} {} {}".format(reg_nr, round(lf_change_p, 3), round(demand_peak_h_p, 3))) labels.append(reg_geocode) # Add average national_tot_cy_p = ((100 / result_dict['lf_by_all_regs_av']) * result_dict['lf_cy_all_regs_av'][scenario]) - 100 #national_tot_demand_p = ((100 / result_dict['demand_by_all_regs']) * result_dict['demand_cy_all_regs'][scenario]) - 100 national_peak_h_p = ((100 / result_dict['peak_h_demand_by_all_regs']) * result_dict['peak_h_demand_cy_all_regs'][scenario]) - 100 x_val_national_lf_demand_cy = [national_tot_cy_p] #y_val_national_lf_demand_cy = [national_tot_demand_p] y_val_national_lf_demand_cy = [national_peak_h_p] all_x_values += x_values all_y_values += y_values # ------------------------------------- # Plot # ------------------------------------- color = color_list[scenario_nr] marker = marker_list[scenario_nr] alpha_value = 0.6 marker_size = 7 ax.scatter( x_values, y_values, alpha=alpha_value, color=color, #marker=marker, edgecolor=color, linewidth=0.5, s=marker_size, label=scenario) # Add average ax.scatter( x_val_national_lf_demand_cy, y_val_national_lf_demand_cy, alpha=1.0, color=color, s=20, marker="v", linewidth=0.5, edgecolor='black', label='national') # -------- # Axis # -------- ax.set_xlabel("load factor change (%) {}".format(fueltype_str)) ax.set_ylabel("change in peak h (%) {}".format(fueltype_str)) plt.tick_params( axis='x', # changes apply to the x-axis which='both', # both major and minor ticks are affected bottom='on', # ticks along the bottom edge are off top='off', # ticks along the top edge are off labelbottom='on') # labels along the bottom edge are off # -------- # Grd # -------- ax.set_axisbelow(True) #ax.grid(True) #ax.set_xticks(minor=False) ax.set_xticks([0], minor=True) #ax.set_yticks(minor=False) ax.set_yticks([0], minor=True) #ax.yaxis.grid(True, which='major') ax.yaxis.grid(True, which='minor', linewidth=0.7, color='grey', linestyle='--') #ax.xaxis.grid(True, which='major') ax.xaxis.grid(True, which='minor', linewidth=0.7, color='grey', linestyle='--') # Limit #plt.ylim(ymin=0) # ----------- # Labelling # ----------- if label_points: for pos, txt in enumerate(labels): ax.text( x_values[pos], y_values[pos], txt, horizontalalignment="right", verticalalignment="top", fontsize=6) # ------- # Title information # ------- max_lf = round(max(all_x_values), 2) min_lf = round(min(all_x_values), 2) min_peak_h = round(min(all_y_values), 2) max_peak_h = round(max(all_y_values), 2) font_additional_info = plotting_styles.font_info(size=4) plt.title( "max_peak_h: {} min_peak_h: {}, min_lf: {} max_lf: {}".format( max_peak_h, min_peak_h, min_lf, max_lf), fontdict=font_additional_info) # -------- # Legend # -------- plt.legend( loc='best', ncol=1, prop={ 'family': 'arial', 'size': 3}, frameon=False) # Tight layout plt.margins(x=0) plt.tight_layout() plt.savefig(fig_name) if plotshow: plt.show() plt.close()