diff --git a/scripts/plot_network.py b/scripts/plot_network.py index 9baa07d4..3e58ecf9 100644 --- a/scripts/plot_network.py +++ b/scripts/plot_network.py @@ -1,49 +1,51 @@ +import cartopy.crs as ccrs +from matplotlib.legend_handler import HandlerPatch +from matplotlib.patches import Circle, Ellipse +from make_summary import assign_carriers +from plot_summary import rename_techs, preferred_order +import numpy as np +import pypsa +import matplotlib.pyplot as plt import pandas as pd -#allow plotting without Xwindows +# allow plotting without Xwindows import matplotlib matplotlib.use('Agg') -import matplotlib.pyplot as plt -import pypsa - -import numpy as np - -from plot_summary import rename_techs, preferred_order - -from make_summary import assign_carriers - -#from sector/scripts/paper_graphics-co2_sweep.py +# from sector/scripts/paper_graphics-co2_sweep.py -from matplotlib.patches import Circle, Ellipse - -from matplotlib.legend_handler import HandlerPatch - -import cartopy.crs as ccrs - - -override_component_attrs = pypsa.descriptors.Dict({k : v.copy() for k,v in pypsa.components.component_attrs.items()}) -override_component_attrs["Link"].loc["bus2"] = ["string",np.nan,np.nan,"2nd bus","Input (optional)"] -override_component_attrs["Link"].loc["bus3"] = ["string",np.nan,np.nan,"3rd bus","Input (optional)"] -override_component_attrs["Link"].loc["efficiency2"] = ["static or series","per unit",1.,"2nd bus efficiency","Input (optional)"] -override_component_attrs["Link"].loc["efficiency3"] = ["static or series","per unit",1.,"3rd bus efficiency","Input (optional)"] -override_component_attrs["Link"].loc["p2"] = ["series","MW",0.,"2nd bus output","Output"] -override_component_attrs["Link"].loc["p3"] = ["series","MW",0.,"3rd bus output","Output"] -override_component_attrs["StorageUnit"].loc["p_dispatch"] = ["series","MW",0.,"Storage discharging.","Output"] -override_component_attrs["StorageUnit"].loc["p_store"] = ["series","MW",0.,"Storage charging.","Output"] +override_component_attrs = pypsa.descriptors.Dict( + {k: v.copy() for k, v in pypsa.components.component_attrs.items()}) +override_component_attrs["Link"].loc["bus2"] = [ + "string", np.nan, np.nan, "2nd bus", "Input (optional)"] +override_component_attrs["Link"].loc["bus3"] = [ + "string", np.nan, np.nan, "3rd bus", "Input (optional)"] +override_component_attrs["Link"].loc["efficiency2"] = [ + "static or series", "per unit", 1., "2nd bus efficiency", "Input (optional)"] +override_component_attrs["Link"].loc["efficiency3"] = [ + "static or series", "per unit", 1., "3rd bus efficiency", "Input (optional)"] +override_component_attrs["Link"].loc["p2"] = [ + "series", "MW", 0., "2nd bus output", "Output"] +override_component_attrs["Link"].loc["p3"] = [ + "series", "MW", 0., "3rd bus output", "Output"] +override_component_attrs["StorageUnit"].loc["p_dispatch"] = [ + "series", "MW", 0., "Storage discharging.", "Output"] +override_component_attrs["StorageUnit"].loc["p_store"] = [ + "series", "MW", 0., "Storage charging.", "Output"] +# ----------------- PLOT HELPERS --------------------------------------------- def rename_techs_tyndp(tech): tech = rename_techs(tech) if "heat pump" in tech or "resistive heater" in tech: return "power-to-heat" - elif tech in ["methanation","hydrogen storage","helmeth"]: + elif tech in ["methanation", "hydrogen storage", "helmeth"]: return "power-to-gas" - elif tech in ["OCGT","CHP","gas boiler"]: + elif tech in ["OCGT", "CHP", "gas boiler"]: return "gas-to-power/heat" elif "solar" in tech: return "solar" @@ -54,16 +56,20 @@ def rename_techs_tyndp(tech): else: return tech + def make_handler_map_to_scale_circles_as_in(ax, dont_resize_actively=False): fig = ax.get_figure() + def axes2pt(): - return np.diff(ax.transData.transform([(0,0), (1,1)]), axis=0)[0] * (72./fig.dpi) + return np.diff(ax.transData.transform([(0, 0), (1, 1)]), axis=0)[ + 0] * (72. / fig.dpi) ellipses = [] if not dont_resize_actively: def update_width_height(event): dist = axes2pt() - for e, radius in ellipses: e.width, e.height = 2. * radius * dist + for e, radius in ellipses: + e.width, e.height = 2. * radius * dist fig.canvas.mpl_connect('resize_event', update_width_height) ax.callbacks.connect('xlim_changed', update_width_height) ax.callbacks.connect('ylim_changed', update_width_height) @@ -71,315 +77,333 @@ def make_handler_map_to_scale_circles_as_in(ax, dont_resize_actively=False): def legend_circle_handler(legend, orig_handle, xdescent, ydescent, width, height, fontsize): w, h = 2. * orig_handle.get_radius() * axes2pt() - e = Ellipse(xy=(0.5*width-0.5*xdescent, 0.5*height-0.5*ydescent), width=w, height=w) + e = Ellipse(xy=(0.5 * width - 0.5 * xdescent, 0.5 * + height - 0.5 * ydescent), width=w, height=w) ellipses.append((e, orig_handle.get_radius())) return e return {Circle: HandlerPatch(patch_func=legend_circle_handler)} - def make_legend_circles_for(sizes, scale=1.0, **kw): - return [Circle((0,0), radius=(s/scale)**0.5, **kw) for s in sizes] + return [Circle((0, 0), radius=(s / scale)**0.5, **kw) for s in sizes] + def assign_location(n): - for c in n.iterate_components(n.one_port_components|n.branch_components): + for c in n.iterate_components(n.one_port_components | n.branch_components): - ifind = pd.Series(c.df.index.str.find(" ",start=4),c.df.index) + ifind = pd.Series(c.df.index.str.find(" ", start=4), c.df.index) for i in ifind.value_counts().index: - #these have already been assigned defaults + # these have already been assigned defaults if i == -1: continue names = ifind.index[ifind == i] - c.df.loc[names,'location'] = names.str[:i] + c.df.loc[names, 'location'] = names.str[:i] +# ----------------- PLOT FUNCTIONS -------------------------------------------- +def plot_map(network, components=["links", "stores", "storage_units", "generators"], + bus_size_factor=1.7e10, transmission=False): -def plot_map(components=["links","stores","storage_units","generators"],bus_size_factor=1.7e10): - - n = pypsa.Network(snakemake.input.network, - override_component_attrs=override_component_attrs) - - + n = network.copy() assign_location(n) - - #Drop non-electric buses so they don't clutter the plot - n.buses.drop(n.buses.index[n.buses.carrier != "AC"],inplace=True) + # Drop non-electric buses so they don't clutter the plot + n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True) costs = pd.DataFrame(index=n.buses.index) for comp in components: - getattr(n,comp)["nice_group"] = getattr(n,comp).carrier.map(rename_techs_tyndp) + print(comp) + df_c = getattr(n, comp) + df_c["nice_group"] = df_c.carrier.map(rename_techs_tyndp) attr = "e_nom_opt" if comp == "stores" else "p_nom_opt" - costs = pd.concat((costs,(getattr(n,comp).capital_cost*getattr(n,comp)[attr]).groupby((getattr(n,comp).location,getattr(n,comp).nice_group)).sum().unstack().fillna(0.)),axis=1) + costs_c = ((df_c.capital_cost * df_c[attr]) + .groupby([df_c.location, df_c.nice_group]).sum() + .unstack().fillna(0.)) + costs = pd.concat([costs, costs_c], axis=1) - print(comp,costs) - costs = costs.groupby(costs.columns,axis=1).sum() + print(comp, costs) + costs = costs.groupby(costs.columns, axis=1).sum() + costs.drop(list(costs.columns[(costs == 0.).all()]), axis=1, inplace=True) - costs.drop(list(costs.columns[(costs == 0.).all()]),axis=1,inplace=True) - - new_columns = (preferred_order&costs.columns).append(costs.columns.difference(preferred_order)) - + new_columns = ((preferred_order & costs.columns) + .append(costs.columns.difference(preferred_order))) costs = costs[new_columns] - #print(costs) - #print(costs.sum()) + costs = costs.stack() # .sort_index() - costs = costs.stack()#.sort_index() + # hack because impossible to drop buses... + n.buses.loc["EU gas", ["x", "y"]] = n.buses.loc["DE0 0", ["x", "y"]] - #print(costs) + n.links.drop(n.links.index[(n.links.carrier != "DC") & ( + n.links.carrier != "B2B")], inplace=True) - fig, ax = plt.subplots(subplot_kw={"projection":ccrs.PlateCarree()}) + # drop non-bus + to_drop = costs.index.levels[0] ^ n.buses.index + if len(to_drop) != 0: + print("dropping non-buses", to_drop) + costs.drop(to_drop, level=0, inplace=True, axis=0) - fig.set_size_inches(7,6) + # make sure they are removed from index + costs.index = pd.MultiIndex.from_tuples(costs.index.values) - linewidth_factor=2e3 - ac_color="gray" - dc_color="m" - - #hack because impossible to drop buses... - n.buses.loc["EU gas",["x","y"]] = n.buses.loc["DE0 0",["x","y"]] - - n.links.drop(n.links.index[(n.links.carrier != "DC") & (n.links.carrier != "B2B")],inplace=True) - - - if snakemake.wildcards.lv == "1.0": - #should be zero - line_widths_exp = pd.concat(dict(Line=(n.lines.s_nom_opt-n.lines.s_nom), Link=(n.links.p_nom_opt-n.links.p_nom))) - else: - line_widths_exp = pd.concat(dict(Line=(n.lines.s_nom_opt-n.lines.s_nom_min), Link=(n.links.p_nom_opt-n.links.p_nom_min))) - - #PDF has minimum width, so set these to zero + # PDF has minimum width, so set these to zero line_threshold = 500. + linewidth_factor = 2e4 + ac_color = "gray" + dc_color = "m" + + if snakemake.wildcards["lv"] == "1.0": + # should be zero + line_widths_exp = pd.concat( + dict( + Line=( + n.lines.s_nom_opt - + n.lines.s_nom), + Link=( + n.links.p_nom_opt - + n.links.p_nom))) + if transmission: + line_widths_exp = pd.concat( + dict(Line=n.lines.s_nom_opt, + Link=n.links.p_nom_opt)) + linewidth_factor = 2e3 + line_threshold = 0. + + else: + line_widths_exp = pd.concat( + dict( + Line=( + n.lines.s_nom_opt - + n.lines.s_nom_min), + Link=( + n.links.p_nom_opt - + n.links.p_nom_min))) line_widths_exp[line_widths_exp < line_threshold] = 0. - #drop non-bus - to_drop = costs.index.levels[0]^n.buses.index - print("dropping non-buses",to_drop) - costs.drop(to_drop,level=0,inplace=True,axis=0) + if transmission: + line_widths_exp[line_widths_exp > 1e4] = 1e4 - #make sure they are removed from index - costs.index = pd.MultiIndex.from_tuples(costs.index.values) + fig, ax = plt.subplots(subplot_kw={"projection": ccrs.PlateCarree()}) + fig.set_size_inches(7, 6) - n.plot(bus_sizes=costs/bus_size_factor, + n.plot(bus_sizes=costs / bus_size_factor, bus_colors=snakemake.config['plotting']['tech_colors'], line_colors=dict(Line=ac_color, Link=dc_color), - line_widths=line_widths_exp/linewidth_factor, - ax=ax) + line_widths=line_widths_exp / linewidth_factor, + ax=ax, boundaries=(-10, 30, 34, 70), + color_geomap={'ocean': 'lightblue', 'land': "palegoldenrod"}) - - - handles = make_legend_circles_for([5e9, 1e9], scale=bus_size_factor, facecolor="gray") + handles = make_legend_circles_for( + [5e9, 1e9], scale=bus_size_factor, facecolor="gray") labels = ["{} bEUR/a".format(s) for s in (5, 1)] l2 = ax.legend(handles, labels, - loc="upper left", bbox_to_anchor=(0.01, 1.01), - labelspacing=1.0, - framealpha=1., - title='System cost', - handler_map=make_handler_map_to_scale_circles_as_in(ax)) + loc="upper left", bbox_to_anchor=(0.01, 1.01), + labelspacing=1.0, + framealpha=1., + title='System cost', + handler_map=make_handler_map_to_scale_circles_as_in(ax)) ax.add_artist(l2) handles = [] labels = [] for s in (10, 5): - handles.append(plt.Line2D([0],[0],color=ac_color, - linewidth=s*1e3/linewidth_factor)) + handles.append(plt.Line2D([0], [0], color=ac_color, + linewidth=s * 1e3 / linewidth_factor)) labels.append("{} GW".format(s)) - l1 = l1_1 = ax.legend(handles, labels, - loc="upper left", bbox_to_anchor=(0.30, 1.01), - framealpha=1, - labelspacing=0.8, handletextpad=1.5, - title='Transmission reinforcement') + l1_1 = ax.legend(handles, labels, + loc="upper left", bbox_to_anchor=(0.30, 1.01), + framealpha=1, + labelspacing=0.8, handletextpad=1.5, + title='Transmission reinforcement') + if transmission: + l1_1 = ax.legend(handles, labels, + loc="upper left", bbox_to_anchor=(0.30, 1.01), + framealpha=1, + labelspacing=0.8, handletextpad=1.5, + title='Today\'s transmission') + ax.add_artist(l1_1) - - #ax.set_title("Scenario {} with {} transmission".format(snakemake.config['plotting']['scenario_names'][flex],"optimal" if line_limit == "opt" else "no")) + fig.savefig(snakemake.output.map + "_costs.pdf", transparent=True, + bbox_inches="tight") - fig.tight_layout() - - fig.savefig(snakemake.output.map,transparent=True) - - - -def plot_h2_map(): - - n = pypsa.Network(snakemake.input.network, - override_component_attrs=override_component_attrs) +def plot_h2_map(network): + n = network.copy() if "H2 pipeline" not in n.links.carrier.unique(): return assign_location(n) - bus_size_factor=1e5 - linewidth_factor=1e4 - #MW below which not drawn - line_threshold=1e3 - bus_color="m" - link_color="c" + bus_size_factor = 1e5 + linewidth_factor = 1e4 + # MW below which not drawn + line_threshold = 1e3 + bus_color = "m" + link_color = "c" - #Drop non-electric buses so they don't clutter the plot - n.buses.drop(n.buses.index[n.buses.carrier != "AC"],inplace=True) + # Drop non-electric buses so they don't clutter the plot + n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True) elec = n.links.index[n.links.carrier == "H2 Electrolysis"] bus_sizes = pd.Series(0., index=n.buses.index) - bus_sizes.loc[elec.str.replace(" H2 Electrolysis","")] = n.links.loc[elec,"p_nom_opt"].values/bus_size_factor + bus_sizes.loc[elec.str.replace(" H2 Electrolysis", "")] = \ + n.links.loc[elec, "p_nom_opt"].values / bus_size_factor - #make a fake MultiIndex so that area is correct for legend - bus_sizes.index = pd.MultiIndex.from_product([bus_sizes.index,["electrolysis"]]) + # make a fake MultiIndex so that area is correct for legend + bus_sizes.index = pd.MultiIndex.from_product( + [bus_sizes.index, ["electrolysis"]]) - n.links.drop(n.links.index[n.links.carrier != "H2 pipeline"],inplace=True) + n.links.drop(n.links.index[n.links.carrier != "H2 pipeline"], inplace=True) - link_widths = n.links.p_nom_opt/linewidth_factor + link_widths = n.links.p_nom_opt / linewidth_factor link_widths[n.links.p_nom_opt < line_threshold] = 0. - n.links.bus0 = n.links.bus0.str.replace(" H2","") - n.links.bus1 = n.links.bus1.str.replace(" H2","") + n.links.bus0 = n.links.bus0.str.replace(" H2", "") + n.links.bus1 = n.links.bus1.str.replace(" H2", "") print(link_widths.sort_values()) - print(n.links[["bus0","bus1"]]) + print(n.links[["bus0", "bus1"]]) - fig, ax = plt.subplots(subplot_kw={"projection":ccrs.PlateCarree()}) + fig, ax = plt.subplots(subplot_kw={"projection": ccrs.PlateCarree()}) - fig.set_size_inches(7,6) + fig.set_size_inches(7, 6) n.plot(bus_sizes=bus_sizes, - bus_colors={"electrolysis" : bus_color}, + bus_colors={"electrolysis": bus_color}, line_colors=dict(Link=link_color), - line_widths={"Link" : link_widths}, + line_widths={"Link": link_widths}, branch_components=["Link"], - ax=ax) + ax=ax, boundaries=(-10, 30, 34, 70)) - handles = make_legend_circles_for([50000, 10000], scale=bus_size_factor, facecolor=bus_color) + handles = make_legend_circles_for( + [50000, 10000], scale=bus_size_factor, facecolor=bus_color) labels = ["{} GW".format(s) for s in (50, 10)] l2 = ax.legend(handles, labels, - loc="upper left", bbox_to_anchor=(0.01, 1.01), - labelspacing=1.0, - framealpha=1., - title='Electrolyzer capacity', - handler_map=make_handler_map_to_scale_circles_as_in(ax)) + loc="upper left", bbox_to_anchor=(0.01, 1.01), + labelspacing=1.0, + framealpha=1., + title='Electrolyzer capacity', + handler_map=make_handler_map_to_scale_circles_as_in(ax)) ax.add_artist(l2) handles = [] labels = [] for s in (50, 10): - handles.append(plt.Line2D([0],[0],color=link_color, - linewidth=s*1e3/linewidth_factor)) + handles.append(plt.Line2D([0], [0], color=link_color, + linewidth=s * 1e3 / linewidth_factor)) labels.append("{} GW".format(s)) - l1 = l1_1 = ax.legend(handles, labels, - loc="upper left", bbox_to_anchor=(0.30, 1.01), - framealpha=1, - labelspacing=0.8, handletextpad=1.5, - title='H2 pipeline capacity') + l1_1 = ax.legend(handles, labels, + loc="upper left", bbox_to_anchor=(0.30, 1.01), + framealpha=1, + labelspacing=0.8, handletextpad=1.5, + title='H2 pipeline capacity') ax.add_artist(l1_1) - - #ax.set_title("Scenario {} with {} transmission".format(snakemake.config['plotting']['scenario_names'][flex],"optimal" if line_limit == "opt" else "no")) - - fig.tight_layout() - - fig.savefig(snakemake.output.map.replace("-costs-all","-h2_network"),transparent=True) + fig.savefig(snakemake.output.map + "-h2_network.pdf", transparent=True, + bbox_inches="tight") -def plot_map_without(): - - n = pypsa.Network(snakemake.input.network, - override_component_attrs=override_component_attrs) +def plot_map_without(network): + n = network.copy() assign_location(n) - #Drop non-electric buses so they don't clutter the plot - n.buses.drop(n.buses.index[n.buses.carrier != "AC"],inplace=True) + # Drop non-electric buses so they don't clutter the plot + n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True) - fig, ax = plt.subplots(subplot_kw={"projection":ccrs.PlateCarree()}) + fig, ax = plt.subplots(subplot_kw={"projection": ccrs.PlateCarree()}) - fig.set_size_inches(7,6) + fig.set_size_inches(7, 6) - linewidth_factor=2e3 - ac_color="gray" - dc_color="m" + linewidth_factor = 2e3 + ac_color = "gray" + dc_color = "m" - #hack because impossible to drop buses... - n.buses.loc["EU gas",["x","y"]] = n.buses.loc["DE0 0",["x","y"]] + # hack because impossible to drop buses... + n.buses.loc["EU gas", ["x", "y"]] = n.buses.loc["DE0 0", ["x", "y"]] - n.links.drop(n.links.index[(n.links.carrier != "DC") & (n.links.carrier != "B2B")],inplace=True) + n.links.drop(n.links.index[(n.links.carrier != "DC") & ( + n.links.carrier != "B2B")], inplace=True) - - if snakemake.wildcards.lv == "1.0": - line_widths_exp = pd.concat(dict(Line=(n.lines.s_nom), Link=(n.links.p_nom))) + if snakemake.wildcards["lv"] == "1.0": + line_widths_exp = pd.concat( + dict( + Line=( + n.lines.s_nom), Link=( + n.links.p_nom))) else: - line_widths_exp = pd.concat(dict(Line=(n.lines.s_nom_min), Link=(n.links.p_nom_min))) + line_widths_exp = pd.concat( + dict( + Line=( + n.lines.s_nom_min), Link=( + n.links.p_nom_min))) - #PDF has minimum width, so set these to zero + # PDF has minimum width, so set these to zero line_threshold = 0. line_widths_exp[line_widths_exp < line_threshold] = 0. line_widths_exp[line_widths_exp > 1e4] = 1e4 - n.plot(bus_sizes=10, bus_colors="k", line_colors=dict(Line=ac_color, Link=dc_color), - line_widths=line_widths_exp/linewidth_factor, - ax=ax) + line_widths=line_widths_exp / linewidth_factor, + ax=ax, boundaries=(-10, 30, 34, 70)) handles = [] labels = [] for s in (10, 5): - handles.append(plt.Line2D([0],[0],color=ac_color, - linewidth=s*1e3/linewidth_factor)) + handles.append(plt.Line2D([0], [0], color=ac_color, + linewidth=s * 1e3 / linewidth_factor)) labels.append("{} GW".format(s)) - l1 = l1_1 = ax.legend(handles, labels, - loc="upper left", bbox_to_anchor=(0.05, 1.01), - framealpha=1, - labelspacing=0.8, handletextpad=1.5, - title='Today\'s transmission') + l1_1 = ax.legend(handles, labels, + loc="upper left", bbox_to_anchor=(0.05, 1.01), + framealpha=1, + labelspacing=0.8, handletextpad=1.5, + title='Today\'s transmission') ax.add_artist(l1_1) - - #ax.set_title("Scenario {} with {} transmission".format(snakemake.config['plotting']['scenario_names'][flex],"optimal" if line_limit == "opt" else "no")) + fig.savefig(snakemake.output.today, transparent=True, bbox_inches="tight") - fig.tight_layout() - - fig.savefig(snakemake.output.today,transparent=True) - - -def plot_series(carrier="AC"): - - n = pypsa.Network(snakemake.input.network, - override_component_attrs=override_component_attrs) - +def plot_series(network, carrier="AC", name="test"): + n = network.copy() assign_location(n) - assign_carriers(n) - buses = n.buses.index[n.buses.carrier == carrier] + buses = n.buses.index[n.buses.carrier.str.contains(carrier)] supply = pd.DataFrame(index=n.snapshots) for c in n.iterate_components(n.branch_components): for i in range(2): - supply = pd.concat((supply,(-1)*c.pnl["p"+str(i)].loc[:,c.df.index[c.df["bus" + str(i)].isin(buses)]].groupby(c.df.carrier,axis=1).sum()),axis=1) + supply = pd.concat((supply, + (-1) * c.pnl["p" + str(i)].loc[:, + c.df.index[c.df["bus" + str(i)].isin(buses)]].groupby(c.df.carrier, + axis=1).sum()), + axis=1) for c in n.iterate_components(n.one_port_components): comps = c.df.index[c.df.bus.isin(buses)] - supply = pd.concat((supply,((c.pnl["p"].loc[:,comps]).multiply(c.df.loc[comps,"sign"])).groupby(c.df.carrier,axis=1).sum()),axis=1) + supply = pd.concat((supply, ((c.pnl["p"].loc[:, comps]).multiply( + c.df.loc[comps, "sign"])).groupby(c.df.carrier, axis=1).sum()), axis=1) - supply = supply.groupby(rename_techs_tyndp,axis=1).sum() + supply = supply.groupby(rename_techs_tyndp, axis=1).sum() both = supply.columns[(supply < 0.).any() & (supply > 0.).any()] @@ -395,46 +419,70 @@ def plot_series(carrier="AC"): negative_supply.columns = negative_supply.columns + suffix - supply = pd.concat((supply,negative_supply),axis=1) + supply = pd.concat((supply, negative_supply), axis=1) + # 14-21.2 for flaute + # 19-26.1 for flaute - fig, ax = plt.subplots() - - fig.set_size_inches((8,5)) - - #14-21.2 for flaute - #19-26.1 for flaute - - start = "2013-01-19" - - stop = "2013-01-26" + start = "2013-02-19" + stop = "2013-02-26" threshold = 10e3 to_drop = supply.columns[(abs(supply) < threshold).all()] - print("dropping",to_drop) + if len(to_drop) != 0: + print("dropping", to_drop) + supply.drop(columns=to_drop, inplace=True) - supply.drop(columns=to_drop,inplace=True) + supply.index.name = None - supply.index.name=None + supply = supply / 1e3 - supply = supply/1e3 - - supply.rename(columns={"electricity" : "electric demand", - "heat" : "heat demand"}, + supply.rename(columns={"electricity": "electric demand", + "heat": "heat demand"}, inplace=True) + supply.columns = supply.columns.str.replace("residential ", "") + supply.columns = supply.columns.str.replace("services ", "") + supply.columns = supply.columns.str.replace("urban decentral ", "decentral ") - preferred_order = pd.Index(["electric demand","transmission lines","hydroelectricity","hydro reservoir","run of river","pumped hydro storage","CHP","onshore wind","offshore wind","solar PV","solar thermal","building retrofitting","ground heat pump","air heat pump","resistive heater","OCGT","gas boiler","gas","natural gas","methanation","hydrogen storage","battery storage","hot water storage"]) + preferred_order = pd.Index(["electric demand", + "transmission lines", + "hydroelectricity", + "hydro reservoir", + "run of river", + "pumped hydro storage", + "CHP", + "onshore wind", + "offshore wind", + "solar PV", + "solar thermal", + "building retrofitting", + "ground heat pump", + "air heat pump", + "resistive heater", + "OCGT", + "gas boiler", + "gas", + "natural gas", + "methanation", + "hydrogen storage", + "battery storage", + "hot water storage"]) - new_columns = (preferred_order&supply.columns).append(supply.columns.difference(preferred_order)) + new_columns = ((preferred_order & supply.columns) + .append(supply.columns.difference(preferred_order))) + + supply = supply.groupby(supply.columns, axis=1).sum() + fig, ax = plt.subplots() + fig.set_size_inches((8, 5)) + (supply.loc[start:stop, new_columns] + .plot(ax=ax, kind="area", stacked=True, linewidth=0., + color=[snakemake.config['plotting']['tech_colors'][i.replace(suffix, "")] + for i in new_columns])) - supply.loc[start:stop,new_columns].plot(ax=ax,kind="area",stacked=True,linewidth=0.,color=[snakemake.config['plotting']['tech_colors'][i.replace(suffix,"")] for i in new_columns]) - - - - handles,labels = ax.get_legend_handles_labels() + handles, labels = ax.get_legend_handles_labels() handles.reverse() labels.reverse() @@ -442,26 +490,26 @@ def plot_series(carrier="AC"): new_handles = [] new_labels = [] - for i,item in enumerate(labels): + for i, item in enumerate(labels): if "charging" not in item: new_handles.append(handles[i]) new_labels.append(labels[i]) - ax.legend(new_handles,new_labels,ncol=3,loc="upper left") - - ax.set_xlim([start,stop]) - - ax.set_ylim([-1300,1900]) - + ax.legend(new_handles, new_labels, ncol=3, loc="upper left") + ax.set_xlim([start, stop]) + ax.set_ylim([-1300, 1900]) ax.grid(True) - ax.set_ylabel("Power [GW]") - fig.tight_layout() - fig.savefig("{}/series-{}-{}-{}.pdf".format(snakemake.config['summary_dir'],carrier,start,stop),transparent=True) + fig.savefig("{}{}/maps/series-{}-{}-{}-{}-{}.pdf".format( + snakemake.config['results_dir'], snakemake.config['run'], + snakemake.wildcards["lv"], + carrier, start, stop, name), + transparent=True) +# %% if __name__ == "__main__": # Detect running outside of snakemake and mock snakemake for testing if 'snakemake' not in globals(): @@ -469,29 +517,36 @@ if __name__ == "__main__": import yaml snakemake = Dict() with open('config.yaml') as f: - snakemake.config = yaml.load(f) + snakemake.config = yaml.safe_load(f) + snakemake.config['run'] = "retro_vs_noretro" + snakemake.wildcards = {"lv": "1.0"} # lv1.0, lv1.25, lvopt + name = "elec_s_48_lv{}__Co2L0-3H-T-H-B".format(snakemake.wildcards["lv"]) + suffix = "_retro_tes" + name = name + suffix snakemake.input = Dict() - snakemake.output = Dict() - snakemake.input.scenario = "lv1.0" #lv1.0, lv1.25, lvopt - snakemake.config["run"] = "190503-es2050-lv" - snakemake.input.network = "{}{}/postnetworks/elec_s_181_{}__Co2L0-3H-T-H-B-I-solar3.nc".format(snakemake.config['results_dir'], - snakemake.config['run'], - snakemake.input.scenario) - snakemake.output.network = "{}{}/maps/elec_s_181_{}__Co2L0-3H-T-H-B-I-solar3.pdf".format(snakemake.config['results_dir'], - snakemake.config['run'], - snakemake.input.scenario) + snakemake.output = Dict( + map=(snakemake.config['results_dir'] + snakemake.config['run'] + + "/maps/{}".format(name)), + today=(snakemake.config['results_dir'] + snakemake.config['run'] + + "/maps/{}.pdf".format(name))) + snakemake.input.scenario = "lv" + snakemake.wildcards["lv"] +# snakemake.config["run"] = "bio_costs" + path = snakemake.config['results_dir'] + snakemake.config['run'] + snakemake.input.network = (path + + "/postnetworks/{}.nc" + .format(name)) + snakemake.output.network = (path + + "/maps/{}" + .format(name)) + n = pypsa.Network(snakemake.input.network, + override_component_attrs=override_component_attrs) - plot_map(components=["generators","links","stores","storage_units"],bus_size_factor=1.5e10) + plot_map(n, components=["generators", "links", "stores", "storage_units"], + bus_size_factor=1.5e10, transmission=True) - plot_h2_map() + plot_h2_map(n) +# plot_map_without(n) - plot_map_without() - - #plot_map(components=["generators"],bus_size_factor=1.7e10,suffix="generators") - - #plot_map(components=["links","stores","storage_units"],bus_size_factor=4e9,suffix="rest") - - #plot_series(carrier="AC") - - #plot_series(carrier="heat") + plot_series(n, carrier="AC", name=suffix) + plot_series(n, carrier="heat", name=suffix)