adjust summary and plot functions
This commit is contained in:
parent
c963d356f7
commit
97f041e82c
@ -150,7 +150,7 @@ def plot_map(network, components=["links", "stores", "storage_units", "generator
|
|||||||
to_drop = costs.index.levels[0].symmetric_difference(n.buses.index)
|
to_drop = costs.index.levels[0].symmetric_difference(n.buses.index)
|
||||||
if len(to_drop) != 0:
|
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, errors="ignore")
|
||||||
|
|
||||||
# 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)
|
||||||
@ -251,19 +251,19 @@ def plot_h2_map(network):
|
|||||||
# 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[n.links.carrier.isin(["H2 Electrolysis", "H2 Fuel Cell"])].index
|
||||||
|
|
||||||
bus_sizes = n.links.loc[elec,"p_nom_opt"].groupby(n.links.loc[elec,"bus0"]).sum() / bus_size_factor
|
bus_sizes = n.links.loc[elec,"p_nom_opt"].groupby([n.links["bus0"], n.links.carrier]).sum() / 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.rename(index=lambda x: x.replace(" H2", ""), level=0, inplace=True)
|
||||||
[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.str.contains("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_lower_threshold] = 0.
|
link_widths[n.links.p_nom_opt < line_lower_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", "")
|
||||||
|
|
||||||
@ -276,7 +276,8 @@ def plot_h2_map(network):
|
|||||||
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={"H2 Electrolysis": bus_color,
|
||||||
|
"H2 Fuel Cell": "slateblue"},
|
||||||
link_colors=link_color,
|
link_colors=link_color,
|
||||||
link_widths=link_widths,
|
link_widths=link_widths,
|
||||||
branch_components=["Link"],
|
branch_components=["Link"],
|
||||||
@ -311,6 +312,266 @@ def plot_h2_map(network):
|
|||||||
bbox_inches="tight")
|
bbox_inches="tight")
|
||||||
|
|
||||||
|
|
||||||
|
def plot_ch4_map(network):
|
||||||
|
|
||||||
|
n = network.copy()
|
||||||
|
|
||||||
|
supply_energy = get_nodal_balance().droplevel([0,1]).sort_index()
|
||||||
|
|
||||||
|
if "Gas pipeline" not in n.links.carrier.unique():
|
||||||
|
return
|
||||||
|
|
||||||
|
assign_location(n)
|
||||||
|
|
||||||
|
bus_size_factor = 1e7
|
||||||
|
linewidth_factor = 1e4
|
||||||
|
# MW below which not drawn
|
||||||
|
line_lower_threshold = 5e3
|
||||||
|
bus_color = "maroon"
|
||||||
|
link_color = "lightcoral"
|
||||||
|
|
||||||
|
# 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.generators[n.generators.carrier=="gas"].index
|
||||||
|
methanation_i = n.links[n.links.carrier.isin(["helmeth", "Sabatier"])].index
|
||||||
|
|
||||||
|
bus_sizes = n.generators_t.p.loc[:,elec].mul(n.snapshot_weightings, axis=0).sum().groupby(n.generators.loc[elec,"bus"]).sum() / bus_size_factor
|
||||||
|
bus_sizes.rename(index=lambda x: x.replace(" gas", ""), inplace=True)
|
||||||
|
bus_sizes = bus_sizes.reindex(n.buses.index).fillna(0)
|
||||||
|
bus_sizes.index = pd.MultiIndex.from_product(
|
||||||
|
[bus_sizes.index, ["fossil gas"]])
|
||||||
|
|
||||||
|
methanation = abs(n.links_t.p1.loc[:,methanation_i].mul(n.snapshot_weightings, axis=0)).sum().groupby(n.links.loc[methanation_i,"bus1"]).sum() / bus_size_factor
|
||||||
|
methanation = methanation.groupby(methanation.index).sum().rename(index=lambda x: x.replace(" gas", ""))
|
||||||
|
# make a fake MultiIndex so that area is correct for legend
|
||||||
|
methanation.index = pd.MultiIndex.from_product(
|
||||||
|
[methanation.index, ["methanation"]])
|
||||||
|
|
||||||
|
biogas_i = n.stores[n.stores.carrier=="biogas"].index
|
||||||
|
biogas = n.stores_t.p.loc[:,biogas_i].mul(n.snapshot_weightings, axis=0).sum().groupby(n.stores.loc[biogas_i,"bus"]).sum() / bus_size_factor
|
||||||
|
biogas = biogas.groupby(biogas.index).sum().rename(index=lambda x: x.replace(" biogas", ""))
|
||||||
|
# make a fake MultiIndex so that area is correct for legend
|
||||||
|
biogas.index = pd.MultiIndex.from_product(
|
||||||
|
[biogas.index, ["biogas"]])
|
||||||
|
|
||||||
|
bus_sizes = pd.concat([bus_sizes, methanation, biogas])
|
||||||
|
bus_sizes.sort_index(inplace=True)
|
||||||
|
|
||||||
|
n.links.drop(n.links.index[n.links.carrier != "Gas pipeline"], inplace=True)
|
||||||
|
|
||||||
|
link_widths = n.links.p_nom_opt / linewidth_factor
|
||||||
|
link_widths[n.links.p_nom_opt < line_lower_threshold] = 0.
|
||||||
|
|
||||||
|
n.links.bus0 = n.links.bus0.str.replace(" gas", "")
|
||||||
|
n.links.bus1 = n.links.bus1.str.replace(" gas", "")
|
||||||
|
|
||||||
|
print(link_widths.sort_values())
|
||||||
|
|
||||||
|
print(n.links[["bus0", "bus1"]])
|
||||||
|
|
||||||
|
fig, ax = plt.subplots(subplot_kw={"projection": ccrs.PlateCarree()})
|
||||||
|
|
||||||
|
fig.set_size_inches(7, 6)
|
||||||
|
|
||||||
|
n.plot(bus_sizes=bus_sizes,
|
||||||
|
bus_colors={"fossil gas": bus_color,
|
||||||
|
"methanation": "steelblue",
|
||||||
|
"biogas": "seagreen"},
|
||||||
|
link_colors=link_color,
|
||||||
|
link_widths=link_widths,
|
||||||
|
branch_components=["Link"],
|
||||||
|
ax=ax, boundaries=(-10, 30, 34, 70))
|
||||||
|
|
||||||
|
handles = make_legend_circles_for(
|
||||||
|
[200, 1000], scale=bus_size_factor, facecolor=bus_color)
|
||||||
|
labels = ["{} MW".format(s) for s in (200, 1000)]
|
||||||
|
l2 = ax.legend(handles, labels,
|
||||||
|
loc="upper left", bbox_to_anchor=(0.01, 1.01),
|
||||||
|
labelspacing=1.0,
|
||||||
|
framealpha=1.,
|
||||||
|
title='Biomass potential',
|
||||||
|
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))
|
||||||
|
labels.append("{} GW".format(s))
|
||||||
|
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='CH4 pipeline capacity')
|
||||||
|
ax.add_artist(l1_1)
|
||||||
|
|
||||||
|
fig.savefig(snakemake.output.map.replace("-costs-all","-ch4_network"), transparent=True,
|
||||||
|
bbox_inches="tight")
|
||||||
|
|
||||||
|
##################################################
|
||||||
|
supply_energy.drop("Gas pipeline", level=1, inplace=True)
|
||||||
|
supply_energy = supply_energy[abs(supply_energy)>5]
|
||||||
|
supply_energy.rename(index=lambda x: x.replace(" gas",""), level=0, inplace=True)
|
||||||
|
|
||||||
|
|
||||||
|
demand = supply_energy[supply_energy<0].groupby(level=[0,1]).sum()
|
||||||
|
supply = supply_energy[supply_energy>0].groupby(level=[0,1]).sum()
|
||||||
|
|
||||||
|
#### DEMAND #######################################
|
||||||
|
bus_size_factor = 2e7
|
||||||
|
bus_sizes = abs(demand) / bus_size_factor
|
||||||
|
|
||||||
|
fig, ax = plt.subplots(subplot_kw={"projection": ccrs.PlateCarree()})
|
||||||
|
|
||||||
|
fig.set_size_inches(7, 6)
|
||||||
|
|
||||||
|
n.plot(bus_sizes=bus_sizes,
|
||||||
|
bus_colors={"CHP": "r",
|
||||||
|
"OCGT": "wheat",
|
||||||
|
"SMR": "darkkhaki",
|
||||||
|
"SMR CC": "tan",
|
||||||
|
"gas boiler": "orange",
|
||||||
|
"gas for industry": "grey",
|
||||||
|
'gas for industry CC': "lightgrey"},
|
||||||
|
link_colors=link_color,
|
||||||
|
link_widths=link_widths,
|
||||||
|
branch_components=["Link"],
|
||||||
|
ax=ax, boundaries=(-10, 30, 34, 70))
|
||||||
|
|
||||||
|
handles = make_legend_circles_for(
|
||||||
|
[10e6, 20e6], scale=bus_size_factor, facecolor=bus_color)
|
||||||
|
labels = ["{} TWh".format(s) for s in (10, 20)]
|
||||||
|
l2 = ax.legend(handles, labels,
|
||||||
|
loc="upper left", bbox_to_anchor=(0.01, 1.01),
|
||||||
|
labelspacing=1.0,
|
||||||
|
framealpha=1.,
|
||||||
|
title='CH4 demand',
|
||||||
|
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))
|
||||||
|
labels.append("{} GW".format(s))
|
||||||
|
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='CH4 pipeline capacity')
|
||||||
|
ax.add_artist(l1_1)
|
||||||
|
|
||||||
|
fig.savefig(snakemake.output.map.replace("-costs-all","-ch4_demand"), transparent=True,
|
||||||
|
bbox_inches="tight")
|
||||||
|
|
||||||
|
|
||||||
|
#### SUPPLY #######################################
|
||||||
|
bus_size_factor = 2e7
|
||||||
|
bus_sizes = supply / bus_size_factor
|
||||||
|
|
||||||
|
fig, ax = plt.subplots(subplot_kw={"projection": ccrs.PlateCarree()})
|
||||||
|
|
||||||
|
fig.set_size_inches(7, 6)
|
||||||
|
|
||||||
|
n.plot(bus_sizes=bus_sizes,
|
||||||
|
bus_colors={"gas": "maroon",
|
||||||
|
"methanation": "steelblue",
|
||||||
|
"helmeth": "slateblue",
|
||||||
|
"biogas": "seagreen"},
|
||||||
|
link_colors=link_color,
|
||||||
|
link_widths=link_widths,
|
||||||
|
branch_components=["Link"],
|
||||||
|
ax=ax, boundaries=(-10, 30, 34, 70))
|
||||||
|
|
||||||
|
handles = make_legend_circles_for(
|
||||||
|
[10e6, 20e6], scale=bus_size_factor, facecolor="black")
|
||||||
|
labels = ["{} TWh".format(s) for s in (10, 20)]
|
||||||
|
l2 = ax.legend(handles, labels,
|
||||||
|
loc="upper left", bbox_to_anchor=(0.01, 1.01),
|
||||||
|
labelspacing=1.0,
|
||||||
|
framealpha=1.,
|
||||||
|
title='CH4 supply',
|
||||||
|
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))
|
||||||
|
labels.append("{} GW".format(s))
|
||||||
|
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='CH4 pipeline capacity')
|
||||||
|
ax.add_artist(l1_1)
|
||||||
|
|
||||||
|
fig.savefig(snakemake.output.map.replace("-costs-all","-ch4_supply"), transparent=True,
|
||||||
|
bbox_inches="tight")
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
net = pd.concat([demand.groupby(level=0).sum().rename("demand"),
|
||||||
|
supply.groupby(level=0).sum().rename("supply")], axis=1).sum(axis=1)
|
||||||
|
mask = net>0
|
||||||
|
net_importer = net.mask(mask).rename("net_importer")
|
||||||
|
net_exporter = net.mask(~mask).rename("net_exporter")
|
||||||
|
|
||||||
|
bus_size_factor = 2e7
|
||||||
|
linewidth_factor = 1e-1
|
||||||
|
bus_sizes = pd.concat([abs(net_importer), net_exporter], axis=1).fillna(0).stack() / bus_size_factor
|
||||||
|
|
||||||
|
link_widths = abs(n.links_t.p0).max().loc[n.links.index] / n.links.p_nom_opt
|
||||||
|
link_widths /= linewidth_factor
|
||||||
|
|
||||||
|
|
||||||
|
fig, ax = plt.subplots(subplot_kw={"projection": ccrs.PlateCarree()})
|
||||||
|
|
||||||
|
fig.set_size_inches(7, 6)
|
||||||
|
|
||||||
|
n.plot(bus_sizes=bus_sizes,
|
||||||
|
bus_colors={"net_importer": "r",
|
||||||
|
"net_exporter": "darkgreen",
|
||||||
|
},
|
||||||
|
link_colors="lightgrey",
|
||||||
|
link_widths=link_widths,
|
||||||
|
branch_components=["Link"],
|
||||||
|
ax=ax, boundaries=(-10, 30, 34, 70))
|
||||||
|
|
||||||
|
handles = make_legend_circles_for(
|
||||||
|
[10e6, 20e6], scale=bus_size_factor, facecolor="black")
|
||||||
|
labels = ["{} TWh".format(s) for s in (10, 20)]
|
||||||
|
l2 = ax.legend(handles, labels,
|
||||||
|
loc="upper left", bbox_to_anchor=(0.01, 1.01),
|
||||||
|
labelspacing=1.0,
|
||||||
|
framealpha=1.,
|
||||||
|
title='Net Import/Export',
|
||||||
|
handler_map=make_handler_map_to_scale_circles_as_in(ax))
|
||||||
|
ax.add_artist(l2)
|
||||||
|
|
||||||
|
handles = []
|
||||||
|
labels = []
|
||||||
|
|
||||||
|
for s in (0.5, 1):
|
||||||
|
handles.append(plt.Line2D([0], [0], color="lightgrey",
|
||||||
|
linewidth=s / linewidth_factor))
|
||||||
|
labels.append("{} per unit".format(s))
|
||||||
|
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='maximum used CH4 pipeline capacity')
|
||||||
|
ax.add_artist(l1_1)
|
||||||
|
|
||||||
|
fig.savefig(snakemake.output.map.replace("-costs-all","-ch4_net_balance"), transparent=True,
|
||||||
|
bbox_inches="tight")
|
||||||
|
|
||||||
def plot_map_without(network):
|
def plot_map_without(network):
|
||||||
|
|
||||||
n = network.copy()
|
n = network.copy()
|
||||||
@ -331,7 +592,8 @@ def plot_map_without(network):
|
|||||||
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"]]
|
if "EU gas" in n.buses.index:
|
||||||
|
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.drop(n.links.index[(n.links.carrier != "DC") & (
|
||||||
n.links.carrier != "B2B")], inplace=True)
|
n.links.carrier != "B2B")], inplace=True)
|
||||||
@ -502,35 +764,59 @@ def plot_series(network, carrier="AC", name="test"):
|
|||||||
transparent=True)
|
transparent=True)
|
||||||
|
|
||||||
|
|
||||||
|
def get_nodal_balance(carrier="gas"):
|
||||||
|
|
||||||
|
bus_map = (n.buses.carrier == carrier)
|
||||||
|
bus_map.at[""] = False
|
||||||
|
supply_energy = pd.Series(dtype="float64")
|
||||||
|
|
||||||
|
for c in n.iterate_components(n.one_port_components):
|
||||||
|
|
||||||
|
items = c.df.index[c.df.bus.map(bus_map).fillna(False)]
|
||||||
|
|
||||||
|
if len(items) == 0:
|
||||||
|
continue
|
||||||
|
|
||||||
|
s = round(c.pnl.p.multiply(n.snapshot_weightings,axis=0).sum().multiply(c.df['sign']).loc[items]
|
||||||
|
.groupby([c.df.bus, c.df.carrier]).sum())
|
||||||
|
s = pd.concat([s], keys=[c.list_name])
|
||||||
|
s = pd.concat([s], keys=[carrier])
|
||||||
|
|
||||||
|
supply_energy = supply_energy.reindex(s.index.union(supply_energy.index))
|
||||||
|
supply_energy.loc[s.index] = s
|
||||||
|
|
||||||
|
|
||||||
|
for c in n.iterate_components(n.branch_components):
|
||||||
|
|
||||||
|
for end in [col[3:] for col in c.df.columns if col[:3] == "bus"]:
|
||||||
|
|
||||||
|
items = c.df.index[c.df["bus" + str(end)].map(bus_map,na_action=False)]
|
||||||
|
|
||||||
|
if len(items) == 0:
|
||||||
|
continue
|
||||||
|
|
||||||
|
s = ((-1)*c.pnl["p"+end][items].multiply(n.snapshot_weightings,axis=0).sum()
|
||||||
|
.groupby([c.df.loc[items,'bus{}'.format(end)], c.df.loc[items,'carrier']]).sum())
|
||||||
|
s.index = s.index
|
||||||
|
s = pd.concat([s], keys=[c.list_name])
|
||||||
|
s = pd.concat([s], keys=[carrier])
|
||||||
|
|
||||||
|
supply_energy = supply_energy.reindex(s.index.union(supply_energy.index))
|
||||||
|
|
||||||
|
supply_energy.loc[s.index] = s
|
||||||
|
|
||||||
|
supply_energy = supply_energy.rename(index=lambda x: rename_techs(x), level=3)
|
||||||
|
return supply_energy
|
||||||
|
|
||||||
# %%
|
# %%
|
||||||
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():
|
||||||
from vresutils import Dict
|
from helper import mock_snakemake
|
||||||
import yaml
|
snakemake = mock_snakemake('plot_network',
|
||||||
snakemake = Dict()
|
network='elec', simpl='', clusters='128',
|
||||||
with open('config.yaml') as f:
|
lv='1.0', opts='', planning_horizons='2030',
|
||||||
snakemake.config = yaml.safe_load(f)
|
sector_opts='Co2L0-168H-T-H-B-I-solar+p3-dist1')
|
||||||
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(
|
|
||||||
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,
|
n = pypsa.Network(snakemake.input.network,
|
||||||
override_component_attrs=override_component_attrs)
|
override_component_attrs=override_component_attrs)
|
||||||
@ -539,6 +825,7 @@ if __name__ == "__main__":
|
|||||||
bus_size_factor=1.5e10, transmission=False)
|
bus_size_factor=1.5e10, transmission=False)
|
||||||
|
|
||||||
plot_h2_map(n)
|
plot_h2_map(n)
|
||||||
|
plot_ch4_map(n)
|
||||||
plot_map_without(n)
|
plot_map_without(n)
|
||||||
|
|
||||||
#plot_series(n, carrier="AC", name=suffix)
|
#plot_series(n, carrier="AC", name=suffix)
|
||||||
|
@ -22,7 +22,8 @@ def rename_techs(label):
|
|||||||
"retrofitting" : "building retrofitting",
|
"retrofitting" : "building retrofitting",
|
||||||
"H2" : "hydrogen storage",
|
"H2" : "hydrogen storage",
|
||||||
"battery" : "battery storage",
|
"battery" : "battery storage",
|
||||||
"CC" : "CC"}
|
#"CC" : "CC"
|
||||||
|
}
|
||||||
|
|
||||||
rename = {"solar" : "solar PV",
|
rename = {"solar" : "solar PV",
|
||||||
"Sabatier" : "methanation",
|
"Sabatier" : "methanation",
|
||||||
@ -258,7 +259,7 @@ def historical_emissions(cts):
|
|||||||
e["domestic navigation"] = "1.A.3.d - Domestic Navigation"
|
e["domestic navigation"] = "1.A.3.d - Domestic Navigation"
|
||||||
e['international navigation'] = '1.D.1.b - International Navigation'
|
e['international navigation'] = '1.D.1.b - International Navigation'
|
||||||
e["domestic aviation"] = '1.A.3.a - Domestic Aviation'
|
e["domestic aviation"] = '1.A.3.a - Domestic Aviation'
|
||||||
e["international aviation"] = '1.D.1.a - International Aviation'
|
e["international aviation"] = '1.D.1.a - International Aviation'
|
||||||
e['total energy'] = '1 - Energy'
|
e['total energy'] = '1 - Energy'
|
||||||
e['industrial processes'] = '2 - Industrial Processes and Product Use'
|
e['industrial processes'] = '2 - Industrial Processes and Product Use'
|
||||||
e['agriculture'] = '3 - Agriculture'
|
e['agriculture'] = '3 - Agriculture'
|
||||||
@ -268,25 +269,25 @@ def historical_emissions(cts):
|
|||||||
e['indirect'] = 'ind_CO2 - Indirect CO2'
|
e['indirect'] = 'ind_CO2 - Indirect CO2'
|
||||||
e["total wL"] = "Total (with LULUCF)"
|
e["total wL"] = "Total (with LULUCF)"
|
||||||
e["total woL"] = "Total (without LULUCF)"
|
e["total woL"] = "Total (without LULUCF)"
|
||||||
|
|
||||||
pol = ["CO2"] # ["All greenhouse gases - (CO2 equivalent)"]
|
pol = ["CO2"] # ["All greenhouse gases - (CO2 equivalent)"]
|
||||||
cts
|
cts
|
||||||
if "GB" in cts:
|
if "GB" in cts:
|
||||||
cts.remove("GB")
|
cts.remove("GB")
|
||||||
cts.append("UK")
|
cts.append("UK")
|
||||||
|
|
||||||
year = np.arange(1990,2018).tolist()
|
year = np.arange(1990,2018).tolist()
|
||||||
|
|
||||||
idx = pd.IndexSlice
|
idx = pd.IndexSlice
|
||||||
co2_totals = df.loc[idx[year,e.values,cts,pol],"emissions"].unstack("Year").rename(index=pd.Series(e.index,e.values))
|
co2_totals = df.loc[idx[year,e.values,cts,pol],"emissions"].unstack("Year").rename(index=pd.Series(e.index,e.values))
|
||||||
|
|
||||||
co2_totals = (1/1e6)*co2_totals.groupby(level=0, axis=0).sum() #Gton CO2
|
co2_totals = (1/1e6)*co2_totals.groupby(level=0, axis=0).sum() #Gton CO2
|
||||||
|
|
||||||
co2_totals.loc['industrial non-elec'] = co2_totals.loc['total energy'] - co2_totals.loc[['electricity', 'services non-elec','residential non-elec', 'road non-elec',
|
co2_totals.loc['industrial non-elec'] = co2_totals.loc['total energy'] - co2_totals.loc[['electricity', 'services non-elec','residential non-elec', 'road non-elec',
|
||||||
'rail non-elec', 'domestic aviation', 'international aviation', 'domestic navigation',
|
'rail non-elec', 'domestic aviation', 'international aviation', 'domestic navigation',
|
||||||
'international navigation']].sum()
|
'international navigation']].sum()
|
||||||
|
|
||||||
emissions = co2_totals.loc["electricity"]
|
emissions = co2_totals.loc["electricity"]
|
||||||
if "T" in opts:
|
if "T" in opts:
|
||||||
emissions += co2_totals.loc[[i+ " non-elec" for i in ["rail","road"]]].sum()
|
emissions += co2_totals.loc[[i+ " non-elec" for i in ["rail","road"]]].sum()
|
||||||
if "H" in opts:
|
if "H" in opts:
|
||||||
@ -294,7 +295,7 @@ def historical_emissions(cts):
|
|||||||
if "I" in opts:
|
if "I" in opts:
|
||||||
emissions += co2_totals.loc[["industrial non-elec","industrial processes",
|
emissions += co2_totals.loc[["industrial non-elec","industrial processes",
|
||||||
"domestic aviation","international aviation",
|
"domestic aviation","international aviation",
|
||||||
"domestic navigation","international navigation"]].sum()
|
"domestic navigation","international navigation"]].sum()
|
||||||
return emissions
|
return emissions
|
||||||
|
|
||||||
|
|
||||||
@ -302,8 +303,8 @@ def historical_emissions(cts):
|
|||||||
def plot_carbon_budget_distribution():
|
def plot_carbon_budget_distribution():
|
||||||
"""
|
"""
|
||||||
Plot historical carbon emissions in the EU and decarbonization path
|
Plot historical carbon emissions in the EU and decarbonization path
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import matplotlib.gridspec as gridspec
|
import matplotlib.gridspec as gridspec
|
||||||
import seaborn as sns; sns.set()
|
import seaborn as sns; sns.set()
|
||||||
sns.set_style('ticks')
|
sns.set_style('ticks')
|
||||||
@ -311,7 +312,7 @@ def plot_carbon_budget_distribution():
|
|||||||
plt.rcParams['xtick.direction'] = 'in'
|
plt.rcParams['xtick.direction'] = 'in'
|
||||||
plt.rcParams['ytick.direction'] = 'in'
|
plt.rcParams['ytick.direction'] = 'in'
|
||||||
plt.rcParams['xtick.labelsize'] = 20
|
plt.rcParams['xtick.labelsize'] = 20
|
||||||
plt.rcParams['ytick.labelsize'] = 20
|
plt.rcParams['ytick.labelsize'] = 20
|
||||||
|
|
||||||
plt.figure(figsize=(10, 7))
|
plt.figure(figsize=(10, 7))
|
||||||
gs1 = gridspec.GridSpec(1, 1)
|
gs1 = gridspec.GridSpec(1, 1)
|
||||||
@ -319,55 +320,55 @@ def plot_carbon_budget_distribution():
|
|||||||
ax1.set_ylabel('CO$_2$ emissions (Gt per year)',fontsize=22)
|
ax1.set_ylabel('CO$_2$ emissions (Gt per year)',fontsize=22)
|
||||||
ax1.set_ylim([0,5])
|
ax1.set_ylim([0,5])
|
||||||
ax1.set_xlim([1990,snakemake.config['scenario']['planning_horizons'][-1]+1])
|
ax1.set_xlim([1990,snakemake.config['scenario']['planning_horizons'][-1]+1])
|
||||||
|
|
||||||
path_cb = snakemake.config['results_dir'] + snakemake.config['run'] + '/csvs/'
|
path_cb = snakemake.config['results_dir'] + snakemake.config['run'] + '/csvs/'
|
||||||
countries=pd.read_csv(path_cb + 'countries.csv', index_col=1)
|
countries=pd.read_csv(path_cb + 'countries.csv', index_col=1)
|
||||||
cts=countries.index.to_list()
|
cts=countries.index.to_list()
|
||||||
e_1990 = co2_emissions_year(cts, opts, year=1990)
|
e_1990 = co2_emissions_year(cts, opts, year=1990)
|
||||||
CO2_CAP=pd.read_csv(path_cb + 'carbon_budget_distribution.csv',
|
CO2_CAP=pd.read_csv(path_cb + 'carbon_budget_distribution.csv',
|
||||||
index_col=0)
|
index_col=0)
|
||||||
|
|
||||||
|
|
||||||
ax1.plot(e_1990*CO2_CAP[o],linewidth=3,
|
ax1.plot(e_1990*CO2_CAP[o],linewidth=3,
|
||||||
color='dodgerblue', label=None)
|
color='dodgerblue', label=None)
|
||||||
|
|
||||||
emissions = historical_emissions(cts)
|
emissions = historical_emissions(cts)
|
||||||
|
|
||||||
ax1.plot(emissions, color='black', linewidth=3, label=None)
|
ax1.plot(emissions, color='black', linewidth=3, label=None)
|
||||||
|
|
||||||
#plot commited and uder-discussion targets
|
#plot commited and uder-discussion targets
|
||||||
#(notice that historical emissions include all countries in the
|
#(notice that historical emissions include all countries in the
|
||||||
# network, but targets refer to EU)
|
# network, but targets refer to EU)
|
||||||
ax1.plot([2020],[0.8*emissions[1990]],
|
ax1.plot([2020],[0.8*emissions[1990]],
|
||||||
marker='*', markersize=12, markerfacecolor='black',
|
marker='*', markersize=12, markerfacecolor='black',
|
||||||
markeredgecolor='black')
|
markeredgecolor='black')
|
||||||
|
|
||||||
ax1.plot([2030],[0.45*emissions[1990]],
|
ax1.plot([2030],[0.45*emissions[1990]],
|
||||||
marker='*', markersize=12, markerfacecolor='white',
|
marker='*', markersize=12, markerfacecolor='white',
|
||||||
markeredgecolor='black')
|
markeredgecolor='black')
|
||||||
|
|
||||||
ax1.plot([2030],[0.6*emissions[1990]],
|
ax1.plot([2030],[0.6*emissions[1990]],
|
||||||
marker='*', markersize=12, markerfacecolor='black',
|
marker='*', markersize=12, markerfacecolor='black',
|
||||||
markeredgecolor='black')
|
markeredgecolor='black')
|
||||||
|
|
||||||
ax1.plot([2050, 2050],[x*emissions[1990] for x in [0.2, 0.05]],
|
ax1.plot([2050, 2050],[x*emissions[1990] for x in [0.2, 0.05]],
|
||||||
color='gray', linewidth=2, marker='_', alpha=0.5)
|
color='gray', linewidth=2, marker='_', alpha=0.5)
|
||||||
|
|
||||||
ax1.plot([2050],[0.01*emissions[1990]],
|
ax1.plot([2050],[0.01*emissions[1990]],
|
||||||
marker='*', markersize=12, markerfacecolor='white',
|
marker='*', markersize=12, markerfacecolor='white',
|
||||||
linewidth=0, markeredgecolor='black',
|
linewidth=0, markeredgecolor='black',
|
||||||
label='EU under-discussion target', zorder=10,
|
label='EU under-discussion target', zorder=10,
|
||||||
clip_on=False)
|
clip_on=False)
|
||||||
|
|
||||||
ax1.plot([2050],[0.125*emissions[1990]],'ro',
|
ax1.plot([2050],[0.125*emissions[1990]],'ro',
|
||||||
marker='*', markersize=12, markerfacecolor='black',
|
marker='*', markersize=12, markerfacecolor='black',
|
||||||
markeredgecolor='black', label='EU commited target')
|
markeredgecolor='black', label='EU commited target')
|
||||||
|
|
||||||
ax1.legend(fancybox=True, fontsize=18, loc=(0.01,0.01),
|
ax1.legend(fancybox=True, fontsize=18, loc=(0.01,0.01),
|
||||||
facecolor='white', frameon=True)
|
facecolor='white', frameon=True)
|
||||||
|
|
||||||
path_cb_plot = snakemake.config['results_dir'] + snakemake.config['run'] + '/graphs/'
|
path_cb_plot = snakemake.config['results_dir'] + snakemake.config['run'] + '/graphs/'
|
||||||
plt.savefig(path_cb_plot+'carbon_budget_plot.pdf', dpi=300)
|
plt.savefig(path_cb_plot+'carbon_budget_plot.pdf', dpi=300)
|
||||||
|
|
||||||
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
|
||||||
@ -380,15 +381,15 @@ if __name__ == "__main__":
|
|||||||
snakemake.input = Dict()
|
snakemake.input = Dict()
|
||||||
snakemake.output = Dict()
|
snakemake.output = Dict()
|
||||||
snakemake.wildcards = Dict()
|
snakemake.wildcards = Dict()
|
||||||
#snakemake.wildcards['sector_opts']='3H-T-H-B-I-solar3-dist1-cb48be3'
|
#snakemake.wildcards['sector_opts']='3H-T-H-B-I-solar3-dist1-cb48be3'
|
||||||
|
|
||||||
for item in ["costs", "energy"]:
|
for item in ["costs", "energy"]:
|
||||||
snakemake.input[item] = snakemake.config['summary_dir'] + '/{name}/csvs/{item}.csv'.format(name=snakemake.config['run'],item=item)
|
snakemake.input[item] = snakemake.config['summary_dir'] + '/{name}/csvs/{item}.csv'.format(name=snakemake.config['run'],item=item)
|
||||||
snakemake.output[item] = snakemake.config['summary_dir'] + '/{name}/graphs/{item}.pdf'.format(name=snakemake.config['run'],item=item)
|
snakemake.output[item] = snakemake.config['summary_dir'] + '/{name}/graphs/{item}.pdf'.format(name=snakemake.config['run'],item=item)
|
||||||
snakemake.input["balances"] = snakemake.config['summary_dir'] + '/{name}/csvs/supply_energy.csv'.format(name=snakemake.config['run'],item=item)
|
snakemake.input["balances"] = snakemake.config['summary_dir'] + '/{name}/csvs/supply_energy.csv'.format(name=snakemake.config['run'],item=item)
|
||||||
snakemake.output["balances"] = snakemake.config['summary_dir'] + '/{name}/graphs/balances-energy.csv'.format(name=snakemake.config['run'],item=item)
|
snakemake.output["balances"] = snakemake.config['summary_dir'] + '/{name}/graphs/balances-energy.csv'.format(name=snakemake.config['run'],item=item)
|
||||||
|
|
||||||
|
|
||||||
n_header = 4
|
n_header = 4
|
||||||
|
|
||||||
plot_costs()
|
plot_costs()
|
||||||
@ -396,7 +397,7 @@ if __name__ == "__main__":
|
|||||||
plot_energy()
|
plot_energy()
|
||||||
|
|
||||||
plot_balances()
|
plot_balances()
|
||||||
|
|
||||||
for sector_opts in snakemake.config['scenario']['sector_opts']:
|
for sector_opts in snakemake.config['scenario']['sector_opts']:
|
||||||
opts=sector_opts.split('-')
|
opts=sector_opts.split('-')
|
||||||
for o in opts:
|
for o in opts:
|
||||||
|
Loading…
Reference in New Issue
Block a user