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,42 +1,44 @@
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
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 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:
@ -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,16 +77,17 @@ 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):
@ -96,86 +103,105 @@ def assign_location(n):
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)
#print(costs.sum())
costs = costs.stack() # .sort_index() costs = costs.stack() # .sort_index()
#print(costs)
fig, ax = plt.subplots(subplot_kw={"projection":ccrs.PlateCarree()})
fig.set_size_inches(7,6)
linewidth_factor=2e3
ac_color="gray"
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":
#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_widths_exp[line_widths_exp < line_threshold] = 0.
# drop non-bus # drop non-bus
to_drop = costs.index.levels[0] ^ n.buses.index to_drop = costs.index.levels[0] ^ n.buses.index
if len(to_drop) != 0:
print("dropping non-buses", to_drop) print("dropping non-buses", to_drop)
costs.drop(to_drop, level=0, inplace=True, axis=0) costs.drop(to_drop, level=0, inplace=True, axis=0)
# make sure they are removed from index # make sure they are removed from index
costs.index = pd.MultiIndex.from_tuples(costs.index.values) costs.index = pd.MultiIndex.from_tuples(costs.index.values)
# 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.
if transmission:
line_widths_exp[line_widths_exp > 1e4] = 1e4
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'], 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),
@ -192,28 +218,27 @@ def plot_map(components=["links","stores","storage_units","generators"],bus_size
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
@ -232,10 +257,12 @@ def plot_h2_map():
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)
@ -258,9 +285,10 @@ def plot_h2_map():
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),
@ -277,26 +305,20 @@ def plot_h2_map():
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
@ -313,13 +335,21 @@ def plot_map_without():
# 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.
@ -328,12 +358,11 @@ def plot_map_without():
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 = []
@ -342,42 +371,37 @@ def plot_map_without():
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()
@ -397,24 +421,18 @@ def plot_series(carrier="AC"):
supply = pd.concat((supply, negative_supply), axis=1) supply = pd.concat((supply, negative_supply), axis=1)
fig, ax = plt.subplots()
fig.set_size_inches((8,5))
# 14-21.2 for flaute # 14-21.2 for flaute
# 19-26.1 for flaute # 19-26.1 for flaute
start = "2013-01-19" start = "2013-02-19"
stop = "2013-02-26"
stop = "2013-01-26"
threshold = 10e3 threshold = 10e3
to_drop = supply.columns[(abs(supply) < threshold).all()] to_drop = supply.columns[(abs(supply) < threshold).all()]
if len(to_drop) != 0:
print("dropping", to_drop) 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
@ -424,15 +442,45 @@ def plot_series(carrier="AC"):
supply.rename(columns={"electricity": "electric demand", supply.rename(columns={"electricity": "electric demand",
"heat": "heat 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.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 = 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]))
handles, labels = ax.get_legend_handles_labels() handles, labels = ax.get_legend_handles_labels()
@ -448,20 +496,20 @@ def plot_series(carrier="AC"):
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")