make the script running with pandas 1.0, colors for some network plots, add option to plot the current transmission system in the cost_network plot

This commit is contained in:
lisazeyen 2020-03-25 17:14:28 +01:00
parent 1dd5f076a2
commit a239f7efbf

View File

@ -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 import pandas as pd
#allow plotting without Xwindows # allow plotting without Xwindows
import matplotlib import matplotlib
matplotlib.use('Agg') matplotlib.use('Agg')
import matplotlib.pyplot as plt
import pypsa # from sector/scripts/paper_graphics-co2_sweep.py
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 matplotlib.patches import Circle, Ellipse override_component_attrs = pypsa.descriptors.Dict(
{k: v.copy() for k, v in pypsa.components.component_attrs.items()})
from matplotlib.legend_handler import HandlerPatch override_component_attrs["Link"].loc["bus2"] = [
"string", np.nan, np.nan, "2nd bus", "Input (optional)"]
import cartopy.crs as ccrs override_component_attrs["Link"].loc["bus3"] = [
"string", np.nan, np.nan, "3rd bus", "Input (optional)"]
override_component_attrs["Link"].loc["efficiency2"] = [
override_component_attrs = pypsa.descriptors.Dict({k : v.copy() for k,v in pypsa.components.component_attrs.items()}) "static or series", "per unit", 1., "2nd bus efficiency", "Input (optional)"]
override_component_attrs["Link"].loc["bus2"] = ["string",np.nan,np.nan,"2nd bus","Input (optional)"] override_component_attrs["Link"].loc["efficiency3"] = [
override_component_attrs["Link"].loc["bus3"] = ["string",np.nan,np.nan,"3rd bus","Input (optional)"] "static or series", "per unit", 1., "3rd bus efficiency", "Input (optional)"]
override_component_attrs["Link"].loc["efficiency2"] = ["static or series","per unit",1.,"2nd bus efficiency","Input (optional)"] override_component_attrs["Link"].loc["p2"] = [
override_component_attrs["Link"].loc["efficiency3"] = ["static or series","per unit",1.,"3rd bus efficiency","Input (optional)"] "series", "MW", 0., "2nd bus output", "Output"]
override_component_attrs["Link"].loc["p2"] = ["series","MW",0.,"2nd bus output","Output"] override_component_attrs["Link"].loc["p3"] = [
override_component_attrs["Link"].loc["p3"] = ["series","MW",0.,"3rd bus output","Output"] "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_dispatch"] = [
override_component_attrs["StorageUnit"].loc["p_store"] = ["series","MW",0.,"Storage charging.","Output"] "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): def rename_techs_tyndp(tech):
tech = rename_techs(tech) tech = rename_techs(tech)
if "heat pump" in tech or "resistive heater" in tech: if "heat pump" in tech or "resistive heater" in tech:
return "power-to-heat" return "power-to-heat"
elif tech in ["methanation","hydrogen storage","helmeth"]: elif tech in ["methanation", "hydrogen storage", "helmeth"]:
return "power-to-gas" return "power-to-gas"
elif tech in ["OCGT","CHP","gas boiler"]: elif tech in ["OCGT", "CHP", "gas boiler"]:
return "gas-to-power/heat" return "gas-to-power/heat"
elif "solar" in tech: elif "solar" in tech:
return "solar" return "solar"
@ -54,16 +56,20 @@ def rename_techs_tyndp(tech):
else: else:
return tech return tech
def make_handler_map_to_scale_circles_as_in(ax, dont_resize_actively=False): def make_handler_map_to_scale_circles_as_in(ax, dont_resize_actively=False):
fig = ax.get_figure() fig = ax.get_figure()
def axes2pt(): 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 = [] ellipses = []
if not dont_resize_actively: if not dont_resize_actively:
def update_width_height(event): def update_width_height(event):
dist = axes2pt() 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) fig.canvas.mpl_connect('resize_event', update_width_height)
ax.callbacks.connect('xlim_changed', update_width_height) ax.callbacks.connect('xlim_changed', update_width_height)
ax.callbacks.connect('ylim_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, def legend_circle_handler(legend, orig_handle, xdescent, ydescent,
width, height, fontsize): width, height, fontsize):
w, h = 2. * orig_handle.get_radius() * axes2pt() 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())) ellipses.append((e, orig_handle.get_radius()))
return e return e
return {Circle: HandlerPatch(patch_func=legend_circle_handler)} return {Circle: HandlerPatch(patch_func=legend_circle_handler)}
def make_legend_circles_for(sizes, scale=1.0, **kw): 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): 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: for i in ifind.value_counts().index:
#these have already been assigned defaults # these have already been assigned defaults
if i == -1: if i == -1:
continue continue
names = ifind.index[ifind == i] 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 = network.copy()
n = pypsa.Network(snakemake.input.network,
override_component_attrs=override_component_attrs)
assign_location(n) assign_location(n)
# Drop non-electric buses so they don't clutter the plot
#Drop non-electric buses so they don't clutter the plot n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True)
n.buses.drop(n.buses.index[n.buses.carrier != "AC"],inplace=True)
costs = pd.DataFrame(index=n.buses.index) costs = pd.DataFrame(index=n.buses.index)
for comp in components: 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" 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) print(comp, costs)
costs = costs.groupby(costs.columns,axis=1).sum() 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] costs = costs[new_columns]
#print(costs) costs = costs.stack() # .sort_index()
#print(costs.sum())
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 # PDF has minimum width, so set these to zero
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
line_threshold = 500. 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. line_widths_exp[line_widths_exp < line_threshold] = 0.
#drop non-bus if transmission:
to_drop = costs.index.levels[0]^n.buses.index line_widths_exp[line_widths_exp > 1e4] = 1e4
print("dropping non-buses",to_drop)
costs.drop(to_drop,level=0,inplace=True,axis=0)
#make sure they are removed from index fig, ax = plt.subplots(subplot_kw={"projection": ccrs.PlateCarree()})
costs.index = pd.MultiIndex.from_tuples(costs.index.values) 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'], bus_colors=snakemake.config['plotting']['tech_colors'],
line_colors=dict(Line=ac_color, Link=dc_color), line_colors=dict(Line=ac_color, Link=dc_color),
line_widths=line_widths_exp/linewidth_factor, line_widths=line_widths_exp / linewidth_factor,
ax=ax) 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)] labels = ["{} bEUR/a".format(s) for s in (5, 1)]
l2 = ax.legend(handles, labels, l2 = ax.legend(handles, labels,
loc="upper left", bbox_to_anchor=(0.01, 1.01), loc="upper left", bbox_to_anchor=(0.01, 1.01),
labelspacing=1.0, labelspacing=1.0,
framealpha=1., framealpha=1.,
title='System cost', title='System cost',
handler_map=make_handler_map_to_scale_circles_as_in(ax)) handler_map=make_handler_map_to_scale_circles_as_in(ax))
ax.add_artist(l2) ax.add_artist(l2)
handles = [] handles = []
labels = [] labels = []
for s in (10, 5): for s in (10, 5):
handles.append(plt.Line2D([0],[0],color=ac_color, handles.append(plt.Line2D([0], [0], color=ac_color,
linewidth=s*1e3/linewidth_factor)) linewidth=s * 1e3 / linewidth_factor))
labels.append("{} GW".format(s)) labels.append("{} GW".format(s))
l1 = l1_1 = ax.legend(handles, labels, l1_1 = ax.legend(handles, labels,
loc="upper left", bbox_to_anchor=(0.30, 1.01), loc="upper left", bbox_to_anchor=(0.30, 1.01),
framealpha=1, framealpha=1,
labelspacing=0.8, handletextpad=1.5, labelspacing=0.8, handletextpad=1.5,
title='Transmission reinforcement') 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.add_artist(l1_1)
fig.savefig(snakemake.output.map + "_costs.pdf", transparent=True,
#ax.set_title("Scenario {} with {} transmission".format(snakemake.config['plotting']['scenario_names'][flex],"optimal" if line_limit == "opt" else "no")) bbox_inches="tight")
fig.tight_layout() def plot_h2_map(network):
fig.savefig(snakemake.output.map,transparent=True)
def plot_h2_map():
n = pypsa.Network(snakemake.input.network,
override_component_attrs=override_component_attrs)
n = network.copy()
if "H2 pipeline" not in n.links.carrier.unique(): if "H2 pipeline" not in n.links.carrier.unique():
return return
assign_location(n) assign_location(n)
bus_size_factor=1e5 bus_size_factor = 1e5
linewidth_factor=1e4 linewidth_factor = 1e4
#MW below which not drawn # MW below which not drawn
line_threshold=1e3 line_threshold = 1e3
bus_color="m" bus_color = "m"
link_color="c" link_color = "c"
#Drop non-electric buses so they don't clutter the plot # Drop non-electric buses so they don't clutter the plot
n.buses.drop(n.buses.index[n.buses.carrier != "AC"],inplace=True) n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True)
elec = n.links.index[n.links.carrier == "H2 Electrolysis"] elec = n.links.index[n.links.carrier == "H2 Electrolysis"]
bus_sizes = pd.Series(0., index=n.buses.index) 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 # make a fake MultiIndex so that area is correct for legend
bus_sizes.index = pd.MultiIndex.from_product([bus_sizes.index,["electrolysis"]]) 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. link_widths[n.links.p_nom_opt < line_threshold] = 0.
n.links.bus0 = n.links.bus0.str.replace(" H2","") n.links.bus0 = n.links.bus0.str.replace(" H2", "")
n.links.bus1 = n.links.bus1.str.replace(" H2","") n.links.bus1 = n.links.bus1.str.replace(" H2", "")
print(link_widths.sort_values()) 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, n.plot(bus_sizes=bus_sizes,
bus_colors={"electrolysis" : bus_color}, bus_colors={"electrolysis": bus_color},
line_colors=dict(Link=link_color), line_colors=dict(Link=link_color),
line_widths={"Link" : link_widths}, line_widths={"Link": link_widths},
branch_components=["Link"], 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)] labels = ["{} GW".format(s) for s in (50, 10)]
l2 = ax.legend(handles, labels, l2 = ax.legend(handles, labels,
loc="upper left", bbox_to_anchor=(0.01, 1.01), loc="upper left", bbox_to_anchor=(0.01, 1.01),
labelspacing=1.0, labelspacing=1.0,
framealpha=1., framealpha=1.,
title='Electrolyzer capacity', title='Electrolyzer capacity',
handler_map=make_handler_map_to_scale_circles_as_in(ax)) handler_map=make_handler_map_to_scale_circles_as_in(ax))
ax.add_artist(l2) ax.add_artist(l2)
handles = [] handles = []
labels = [] labels = []
for s in (50, 10): for s in (50, 10):
handles.append(plt.Line2D([0],[0],color=link_color, handles.append(plt.Line2D([0], [0], color=link_color,
linewidth=s*1e3/linewidth_factor)) linewidth=s * 1e3 / linewidth_factor))
labels.append("{} GW".format(s)) labels.append("{} GW".format(s))
l1 = l1_1 = ax.legend(handles, labels, l1_1 = ax.legend(handles, labels,
loc="upper left", bbox_to_anchor=(0.30, 1.01), loc="upper left", bbox_to_anchor=(0.30, 1.01),
framealpha=1, framealpha=1,
labelspacing=0.8, handletextpad=1.5, labelspacing=0.8, handletextpad=1.5,
title='H2 pipeline capacity') title='H2 pipeline capacity')
ax.add_artist(l1_1) ax.add_artist(l1_1)
fig.savefig(snakemake.output.map + "-h2_network.pdf", transparent=True,
#ax.set_title("Scenario {} with {} transmission".format(snakemake.config['plotting']['scenario_names'][flex],"optimal" if line_limit == "opt" else "no")) bbox_inches="tight")
fig.tight_layout()
fig.savefig(snakemake.output.map.replace("-costs-all","-h2_network"),transparent=True)
def plot_map_without(): def plot_map_without(network):
n = pypsa.Network(snakemake.input.network,
override_component_attrs=override_component_attrs)
n = network.copy()
assign_location(n) assign_location(n)
#Drop non-electric buses so they don't clutter the plot # Drop non-electric buses so they don't clutter the plot
n.buses.drop(n.buses.index[n.buses.carrier != "AC"],inplace=True) 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 linewidth_factor = 2e3
ac_color="gray" ac_color = "gray"
dc_color="m" dc_color = "m"
#hack because impossible to drop buses... # hack because impossible to drop buses...
n.buses.loc["EU gas",["x","y"]] = n.buses.loc["DE0 0",["x","y"]] 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":
if snakemake.wildcards.lv == "1.0": line_widths_exp = pd.concat(
line_widths_exp = pd.concat(dict(Line=(n.lines.s_nom), Link=(n.links.p_nom))) dict(
Line=(
n.lines.s_nom), Link=(
n.links.p_nom)))
else: 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_threshold = 0.
line_widths_exp[line_widths_exp < line_threshold] = 0. line_widths_exp[line_widths_exp < line_threshold] = 0.
line_widths_exp[line_widths_exp > 1e4] = 1e4 line_widths_exp[line_widths_exp > 1e4] = 1e4
n.plot(bus_sizes=10, n.plot(bus_sizes=10,
bus_colors="k", bus_colors="k",
line_colors=dict(Line=ac_color, Link=dc_color), line_colors=dict(Line=ac_color, Link=dc_color),
line_widths=line_widths_exp/linewidth_factor, line_widths=line_widths_exp / linewidth_factor,
ax=ax) ax=ax, boundaries=(-10, 30, 34, 70))
handles = [] handles = []
labels = [] labels = []
for s in (10, 5): for s in (10, 5):
handles.append(plt.Line2D([0],[0],color=ac_color, handles.append(plt.Line2D([0], [0], color=ac_color,
linewidth=s*1e3/linewidth_factor)) linewidth=s * 1e3 / linewidth_factor))
labels.append("{} GW".format(s)) labels.append("{} GW".format(s))
l1 = l1_1 = ax.legend(handles, labels, l1_1 = ax.legend(handles, labels,
loc="upper left", bbox_to_anchor=(0.05, 1.01), loc="upper left", bbox_to_anchor=(0.05, 1.01),
framealpha=1, framealpha=1,
labelspacing=0.8, handletextpad=1.5, labelspacing=0.8, handletextpad=1.5,
title='Today\'s transmission') title='Today\'s transmission')
ax.add_artist(l1_1) ax.add_artist(l1_1)
fig.savefig(snakemake.output.today, transparent=True, bbox_inches="tight")
#ax.set_title("Scenario {} with {} transmission".format(snakemake.config['plotting']['scenario_names'][flex],"optimal" if line_limit == "opt" else "no"))
fig.tight_layout() def plot_series(network, carrier="AC", name="test"):
fig.savefig(snakemake.output.today,transparent=True)
def plot_series(carrier="AC"):
n = pypsa.Network(snakemake.input.network,
override_component_attrs=override_component_attrs)
n = network.copy()
assign_location(n) assign_location(n)
assign_carriers(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) supply = pd.DataFrame(index=n.snapshots)
for c in n.iterate_components(n.branch_components): for c in n.iterate_components(n.branch_components):
for i in range(2): 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): for c in n.iterate_components(n.one_port_components):
comps = c.df.index[c.df.bus.isin(buses)] 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()] 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 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() start = "2013-02-19"
stop = "2013-02-26"
fig.set_size_inches((8,5))
#14-21.2 for flaute
#19-26.1 for flaute
start = "2013-01-19"
stop = "2013-01-26"
threshold = 10e3 threshold = 10e3
to_drop = supply.columns[(abs(supply) < threshold).all()] 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) 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() handles.reverse()
labels.reverse() labels.reverse()
@ -442,26 +490,26 @@ def plot_series(carrier="AC"):
new_handles = [] new_handles = []
new_labels = [] new_labels = []
for i,item in enumerate(labels): for i, item in enumerate(labels):
if "charging" not in item: if "charging" not in item:
new_handles.append(handles[i]) new_handles.append(handles[i])
new_labels.append(labels[i]) new_labels.append(labels[i])
ax.legend(new_handles,new_labels,ncol=3,loc="upper left") ax.legend(new_handles, new_labels, ncol=3, loc="upper left")
ax.set_xlim([start, stop])
ax.set_xlim([start,stop]) ax.set_ylim([-1300, 1900])
ax.set_ylim([-1300,1900])
ax.grid(True) ax.grid(True)
ax.set_ylabel("Power [GW]") ax.set_ylabel("Power [GW]")
fig.tight_layout() 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__": if __name__ == "__main__":
# Detect running outside of snakemake and mock snakemake for testing # Detect running outside of snakemake and mock snakemake for testing
if 'snakemake' not in globals(): if 'snakemake' not in globals():
@ -469,29 +517,36 @@ if __name__ == "__main__":
import yaml import yaml
snakemake = Dict() snakemake = Dict()
with open('config.yaml') as f: 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.input = Dict()
snakemake.output = Dict() snakemake.output = Dict(
snakemake.input.scenario = "lv1.0" #lv1.0, lv1.25, lvopt map=(snakemake.config['results_dir'] + snakemake.config['run']
snakemake.config["run"] = "190503-es2050-lv" + "/maps/{}".format(name)),
snakemake.input.network = "{}{}/postnetworks/elec_s_181_{}__Co2L0-3H-T-H-B-I-solar3.nc".format(snakemake.config['results_dir'], today=(snakemake.config['results_dir'] + snakemake.config['run']
snakemake.config['run'], + "/maps/{}.pdf".format(name)))
snakemake.input.scenario) snakemake.input.scenario = "lv" + snakemake.wildcards["lv"]
snakemake.output.network = "{}{}/maps/elec_s_181_{}__Co2L0-3H-T-H-B-I-solar3.pdf".format(snakemake.config['results_dir'], # snakemake.config["run"] = "bio_costs"
snakemake.config['run'], path = snakemake.config['results_dir'] + snakemake.config['run']
snakemake.input.scenario) 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_series(n, carrier="AC", name=suffix)
plot_series(n, carrier="heat", name=suffix)
#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")