restore compatibility with latest master version

This commit is contained in:
Fabian Neumann 2022-12-28 15:43:43 +01:00
parent 520cad53a2
commit 6f901f4c50
4 changed files with 30 additions and 92 deletions

View File

@ -517,7 +517,7 @@ rule plot_network:
input: input:
overrides="data/override_component_attrs", overrides="data/override_component_attrs",
network=RDIR + "/postnetworks/elec_s{simpl}_{clusters}_lv{lv}_{opts}_{sector_opts}_{planning_horizons}.nc", network=RDIR + "/postnetworks/elec_s{simpl}_{clusters}_lv{lv}_{opts}_{sector_opts}_{planning_horizons}.nc",
regions='../pypsa-eur/resources/regions_onshore_elec_s{simpl}_{clusters}.geojson' regions=pypsaeur('resources/regions_onshore_elec_s{simpl}_{clusters}.geojson')
output: output:
map=RDIR + "/maps/elec_s{simpl}_{clusters}_lv{lv}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", map=RDIR + "/maps/elec_s{simpl}_{clusters}_lv{lv}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf",
today=RDIR + "/maps/elec_s{simpl}_{clusters}_lv{lv}_{opts}_{sector_opts}_{planning_horizons}-today.pdf" today=RDIR + "/maps/elec_s{simpl}_{clusters}_lv{lv}_{opts}_{sector_opts}_{planning_horizons}-today.pdf"

View File

@ -1,4 +1,3 @@
backend: Agg
font.family: sans-serif font.family: sans-serif
font.sans-serif: Ubuntu, DejaVu Sans font.sans-serif: Ubuntu, DejaVu Sans
image.cmap: viridis image.cmap: viridis

View File

@ -45,7 +45,9 @@ def mock_snakemake(rulename, **wildcards):
This function is expected to be executed from the 'scripts'-directory of ' This function is expected to be executed from the 'scripts'-directory of '
the snakemake project. It returns a snakemake.script.Snakemake object, the snakemake project. It returns a snakemake.script.Snakemake object,
based on the Snakefile. based on the Snakefile.
If a rule has wildcards, you have to specify them in **wildcards. If a rule has wildcards, you have to specify them in **wildcards.
Parameters Parameters
---------- ----------
rulename: str rulename: str

View File

@ -1,14 +1,11 @@
import pypsa import pypsa
import numpy as np
import pandas as pd import pandas as pd
import geopandas as gpd import geopandas as gpd
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import cartopy.crs as ccrs import cartopy.crs as ccrs
from matplotlib.legend_handler import HandlerPatch from pypsa.plot import add_legend_circles, add_legend_patches, add_legend_lines
from matplotlib.patches import Circle, Patch
from pypsa.plot import projected_area_factor
from make_summary import assign_carriers from make_summary import assign_carriers
from plot_summary import rename_techs, preferred_order from plot_summary import rename_techs, preferred_order
@ -40,69 +37,6 @@ def rename_techs_tyndp(tech):
else: else:
return tech return tech
class HandlerCircle(HandlerPatch):
"""
Legend Handler used to create circles for legend entries.
This handler resizes the circles in order to match the same dimensional
scaling as in the applied axis.
"""
def create_artists(
self, legend, orig_handle, xdescent, ydescent, width, height, fontsize, trans
):
fig = legend.get_figure()
ax = legend.axes
unit = np.diff(ax.transData.transform([(0, 0), (1, 1)]), axis=0)[0][1]
radius = orig_handle.get_radius() * unit * (72 / fig.dpi)
center = 5 - xdescent, 3 - ydescent
p = plt.Circle(center, radius)
self.update_prop(p, orig_handle, legend)
p.set_transform(trans)
return [p]
def add_legend_circles(ax, sizes, labels, scale=1, srid=None, patch_kw={}, legend_kw={}):
if srid is not None:
area_correction = projected_area_factor(ax, n.srid)**2
sizes = [s * area_correction for s in sizes]
handles = make_legend_circles_for(sizes, scale, **patch_kw)
legend = ax.legend(
handles, labels,
handler_map={Circle: HandlerCircle()},
**legend_kw
)
ax.add_artist(legend)
def add_legend_lines(ax, sizes, labels, scale=1, patch_kw={}, legend_kw={}):
handles = [plt.Line2D([0], [0], linewidth=s/scale, **patch_kw) for s in sizes]
legend = ax.legend(
handles, labels,
**legend_kw
)
ax.add_artist(legend)
def add_legend_patches(ax, colors, labels, patch_kw={}, legend_kw={}):
handles = [Patch(facecolor=c, **patch_kw) for c in colors]
legend = ax.legend(handles, labels, **legend_kw)
ax.add_artist(legend)
def make_legend_circles_for(sizes, scale=1.0, **kw):
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):
@ -186,23 +120,23 @@ def plot_map(network, components=["links", "stores", "storage_units", "generator
# should be zero # should be zero
line_widths = n.lines.s_nom_opt - n.lines.s_nom line_widths = n.lines.s_nom_opt - n.lines.s_nom
link_widths = n.links.p_nom_opt - n.links.p_nom link_widths = n.links.p_nom_opt - n.links.p_nom
title = "Added grid" title = "added grid"
if transmission: if transmission:
line_widths = n.lines.s_nom_opt line_widths = n.lines.s_nom_opt
link_widths = n.links.p_nom_opt link_widths = n.links.p_nom_opt
linewidth_factor = 2e3 linewidth_factor = 2e3
line_lower_threshold = 0. line_lower_threshold = 0.
title = "Today's grid" title = "current grid"
else: else:
line_widths = n.lines.s_nom_opt - n.lines.s_nom_min line_widths = n.lines.s_nom_opt - n.lines.s_nom_min
link_widths = n.links.p_nom_opt - n.links.p_nom_min link_widths = n.links.p_nom_opt - n.links.p_nom_min
title = "Added grid" title = "added grid"
if transmission: if transmission:
line_widths = n.lines.s_nom_opt line_widths = n.lines.s_nom_opt
link_widths = n.links.p_nom_opt link_widths = n.links.p_nom_opt
title = "Total grid" title = "total grid"
line_widths[line_widths < line_lower_threshold] = 0. line_widths[line_widths < line_lower_threshold] = 0.
link_widths[link_widths < line_lower_threshold] = 0. link_widths[link_widths < line_lower_threshold] = 0.
@ -233,7 +167,7 @@ def plot_map(network, components=["links", "stores", "storage_units", "generator
labelspacing=0.8, labelspacing=0.8,
frameon=False, frameon=False,
handletextpad=0, handletextpad=0,
title='System cost', title='system cost',
) )
add_legend_circles( add_legend_circles(
@ -247,6 +181,8 @@ def plot_map(network, components=["links", "stores", "storage_units", "generator
sizes = [10, 5] sizes = [10, 5]
labels = [f"{s} GW" for s in sizes] labels = [f"{s} GW" for s in sizes]
scale = 1e3 / linewidth_factor
sizes = [s*scale for s in sizes]
legend_kw = dict( legend_kw = dict(
loc="upper left", loc="upper left",
@ -261,7 +197,6 @@ def plot_map(network, components=["links", "stores", "storage_units", "generator
ax, ax,
sizes, sizes,
labels, labels,
scale=linewidth_factor/1e3,
patch_kw=dict(color='lightgrey'), patch_kw=dict(color='lightgrey'),
legend_kw=legend_kw legend_kw=legend_kw
) )
@ -312,8 +247,6 @@ def group_pipes(df, drop_direction=False):
def plot_h2_map(network, regions): def plot_h2_map(network, regions):
tech_colors = snakemake.config['plotting']['tech_colors']
n = network.copy() n = network.copy()
if "H2 pipeline" not in n.links.carrier.unique(): if "H2 pipeline" not in n.links.carrier.unique():
return return
@ -345,9 +278,11 @@ def plot_h2_map(network, regions):
h2_new = n.links.loc[n.links.carrier=="H2 pipeline"] h2_new = n.links.loc[n.links.carrier=="H2 pipeline"]
h2_retro = n.links.loc[n.links.carrier=='H2 pipeline retrofitted'] h2_retro = n.links.loc[n.links.carrier=='H2 pipeline retrofitted']
# sum capacitiy for pipelines from different investment periods
h2_new = group_pipes(h2_new) if snakemake.config['foresight'] == 'myopic':
h2_retro = group_pipes(h2_retro, drop_direction=True).reindex(h2_new.index).fillna(0) # sum capacitiy for pipelines from different investment periods
h2_new = group_pipes(h2_new)
h2_retro = group_pipes(h2_retro, drop_direction=True).reindex(h2_new.index).fillna(0)
if not h2_retro.empty: if not h2_retro.empty:
@ -419,6 +354,7 @@ def plot_h2_map(network, regions):
) )
n.plot( n.plot(
geomap=True,
bus_sizes=0, bus_sizes=0,
link_colors=color_retrofit, link_colors=color_retrofit,
link_widths=link_widths_retro, link_widths=link_widths_retro,
@ -461,8 +397,10 @@ def plot_h2_map(network, regions):
legend_kw=legend_kw legend_kw=legend_kw
) )
sizes = [50, 10] sizes = [30, 10]
labels = [f"{s} GW" for s in sizes] labels = [f"{s} GW" for s in sizes]
scale = 1e3 / linewidth_factor
sizes = [s*scale for s in sizes]
legend_kw = dict( legend_kw = dict(
loc="upper left", loc="upper left",
@ -476,7 +414,6 @@ def plot_h2_map(network, regions):
ax, ax,
sizes, sizes,
labels, labels,
scale=linewidth_factor/1e3,
patch_kw=dict(color='lightgrey'), patch_kw=dict(color='lightgrey'),
legend_kw=legend_kw, legend_kw=legend_kw,
) )
@ -498,7 +435,6 @@ def plot_h2_map(network, regions):
legend_kw=legend_kw legend_kw=legend_kw
) )
plt.gca().outline_patch.set_visible(False)
ax.set_facecolor("white") ax.set_facecolor("white")
fig.savefig( fig.savefig(
@ -564,7 +500,7 @@ def plot_ch4_map(network):
pipe_colors = { pipe_colors = {
"gas pipeline": "#f08080", "gas pipeline": "#f08080",
"gas pipeline new": "#c46868", "gas pipeline new": "#c46868",
"gas pipeline (2020)": 'lightgrey', "gas pipeline (in 2020)": 'lightgrey',
"gas pipeline (available)": '#e8d1d1', "gas pipeline (available)": '#e8d1d1',
} }
@ -584,7 +520,7 @@ def plot_ch4_map(network):
n.plot( n.plot(
bus_sizes=bus_sizes, bus_sizes=bus_sizes,
bus_colors=bus_colors, bus_colors=bus_colors,
link_colors=pipe_colors['gas pipeline (2020)'], link_colors=pipe_colors['gas pipeline (in 2020)'],
link_widths=link_widths_orig, link_widths=link_widths_orig,
branch_components=["Link"], branch_components=["Link"],
ax=ax, ax=ax,
@ -621,7 +557,7 @@ def plot_ch4_map(network):
labelspacing=0.8, labelspacing=0.8,
frameon=False, frameon=False,
handletextpad=1, handletextpad=1,
title='Gas Sources', title='gas sources',
) )
add_legend_circles( add_legend_circles(
@ -635,6 +571,8 @@ def plot_ch4_map(network):
sizes = [50, 10] sizes = [50, 10]
labels = [f"{s} GW" for s in sizes] labels = [f"{s} GW" for s in sizes]
scale = 1e3 / linewidth_factor
sizes = [s*scale for s in sizes]
legend_kw = dict( legend_kw = dict(
loc="upper left", loc="upper left",
@ -642,14 +580,13 @@ def plot_ch4_map(network):
frameon=False, frameon=False,
labelspacing=0.8, labelspacing=0.8,
handletextpad=1, handletextpad=1,
title='Gas Pipeline' title='gas pipeline'
) )
add_legend_lines( add_legend_lines(
ax, ax,
sizes, sizes,
labels, labels,
scale=linewidth_factor/1e3,
patch_kw=dict(color='lightgrey'), patch_kw=dict(color='lightgrey'),
legend_kw=legend_kw, legend_kw=legend_kw,
) )
@ -740,7 +677,7 @@ def plot_map_without(network):
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(f"{s} GW")
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),
frameon=False, frameon=False,
@ -890,10 +827,10 @@ if __name__ == "__main__":
snakemake = mock_snakemake( snakemake = mock_snakemake(
'plot_network', 'plot_network',
simpl='', simpl='',
clusters="45", clusters="181",
lv=1.0, lv='opt',
opts='', opts='',
sector_opts='168H-T-H-B-I-A-solar+p3-dist1', sector_opts='Co2L0-730H-T-H-B-I-A-solar+p3-linemaxext10',
planning_horizons="2050", planning_horizons="2050",
) )