Skip to content

Commit 5fd5c3d

Browse files
committed
Create cumulative distribution plots
1 parent 32853e8 commit 5fd5c3d

File tree

3 files changed

+133
-0
lines changed

3 files changed

+133
-0
lines changed

papers/Martin_Staadecker_et_al_2022/figure-s4-analysis-of-4-factors.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ def get_data(tools):
156156

157157
def create_secondary_y_axis(ax, include_label, y_lim, y_label, color="grey", offset=-0.2):
158158
rax = ax.twinx()
159+
rax.grid(False)
159160
rax.set_ylim(0, y_lim)
160161
if include_label:
161162
rax.spines["left"].set_position(("axes", offset))
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# %%
2+
import matplotlib.pyplot as plt
3+
import labellines
4+
5+
from papers.Martin_Staadecker_et_al_2022.util import (
6+
set_style,
7+
get_scenario, save_figure
8+
)
9+
from switch_model.tools.graph.main import GraphTools
10+
11+
# Prepare graph tools
12+
tools = GraphTools(scenarios=[
13+
get_scenario("C21", 0.5),
14+
get_scenario("C18", 1),
15+
get_scenario("C22", 2),
16+
get_scenario("C23", 5),
17+
get_scenario("C26", 7),
18+
get_scenario("C17", 10),
19+
get_scenario("C24", 15),
20+
get_scenario("1342", 22.43),
21+
get_scenario("C25", 40),
22+
get_scenario("C19", 70),
23+
get_scenario("C20", 102)
24+
], set_style=False)
25+
tools.pre_graphing(multi_scenario=True)
26+
27+
set_style()
28+
plt.close()
29+
fig = plt.figure()
30+
ax = fig.gca()
31+
# %% Get DATA
32+
ax.clear()
33+
duration = tools.get_dataframe("storage_capacity.csv")
34+
duration["duration"] = duration["duration"] = (
35+
duration["OnlineEnergyCapacityMWh"] / duration["OnlinePowerCapacityMW"]
36+
)
37+
38+
duration = duration.sort_values("duration")
39+
duration = duration[["duration", "OnlinePowerCapacityMW", "scenario_name"]]
40+
duration.OnlinePowerCapacityMW /= 1e3 # Change to GW
41+
42+
for scenario_name in duration.scenario_name.unique():
43+
duration_scenario = duration[duration.scenario_name == scenario_name]
44+
duration_scenario["cuml_power"] = duration_scenario.OnlinePowerCapacityMW.cumsum()
45+
duration_scenario = duration_scenario.set_index("cuml_power")
46+
duration_scenario = duration_scenario["duration"]
47+
line = ax.plot(duration_scenario.index, duration_scenario, drawstyle="steps", label=scenario_name)
48+
if float(int(scenario_name)) == scenario_name:
49+
label = str(int(scenario_name))
50+
else:
51+
label = str(scenario_name)
52+
labellines.labelLine(line[0], duration_scenario.index.max(), outline_width=2, label=label + "$/KWh", align=False,
53+
fontsize="small")
54+
55+
ax.set_yscale("log")
56+
ax.set_xlabel("Storage Power Capacity (GW)")
57+
ax.set_ylabel("Storage Duration (h)")
58+
ax.set_yticks([10, 100, 1000])
59+
ax.set_yticks([2, 3, 4, 5, 6, 7, 8, 9, 20, 30, 40, 50, 60, 70, 80, 90, 200, 300, 400, 500, 600, 700, 800, 900],
60+
minor=True)
61+
ax.set_yticklabels(["10", "100", "1000"])
62+
plt.tight_layout()
63+
64+
# %%
65+
save_figure("figure-s5-duration-cdf-cost-scenarios.png")
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# %%
2+
import matplotlib.pyplot as plt
3+
import labellines
4+
5+
from papers.Martin_Staadecker_et_al_2022.util import (
6+
set_style,
7+
get_scenario, save_figure
8+
)
9+
from switch_model.tools.graph.main import GraphTools
10+
11+
# Prepare graph tools
12+
tools = GraphTools(scenarios=[
13+
get_scenario("C21", 0.5),
14+
get_scenario("C18", 1),
15+
get_scenario("C22", 2),
16+
get_scenario("C23", 5),
17+
get_scenario("C26", 7),
18+
get_scenario("C17", 10),
19+
get_scenario("C24", 15),
20+
get_scenario("1342", 22.43),
21+
get_scenario("C25", 40),
22+
get_scenario("C19", 70),
23+
get_scenario("C20", 102)
24+
], set_style=False)
25+
tools.pre_graphing(multi_scenario=True)
26+
27+
set_style()
28+
plt.close()
29+
fig = plt.figure()
30+
ax = fig.gca()
31+
# %% Get DATA
32+
ax.clear()
33+
duration = tools.get_dataframe("storage_capacity.csv")
34+
duration = tools.transform.load_zone(duration)
35+
duration = duration[duration.region == "CA"]
36+
duration["duration"] = duration["duration"] = (
37+
duration["OnlineEnergyCapacityMWh"] / duration["OnlinePowerCapacityMW"]
38+
)
39+
40+
duration = duration.sort_values("duration")
41+
duration = duration[["duration", "OnlinePowerCapacityMW", "scenario_name"]]
42+
duration.OnlinePowerCapacityMW /= 1e3 # Change to GW
43+
44+
for scenario_name in duration.scenario_name.unique():
45+
duration_scenario = duration[duration.scenario_name == scenario_name]
46+
duration_scenario["cuml_power"] = duration_scenario.OnlinePowerCapacityMW.cumsum()
47+
duration_scenario = duration_scenario.set_index("cuml_power")
48+
duration_scenario = duration_scenario["duration"]
49+
line = ax.plot(duration_scenario.index, duration_scenario, drawstyle="steps", label=scenario_name)
50+
if float(int(scenario_name)) == scenario_name:
51+
label = str(int(scenario_name))
52+
else:
53+
label = str(scenario_name)
54+
labellines.labelLine(line[0], duration_scenario.index.max(), outline_width=2, label=label + "$/KWh", align=False,
55+
fontsize="small")
56+
57+
ax.set_yscale("log")
58+
ax.set_xlabel("Storage Power Capacity (GW)")
59+
ax.set_ylabel("Storage Duration (h)")
60+
ax.set_yticks([10, 100, 1000])
61+
ax.set_yticks([2, 3, 4, 5, 6, 7, 8, 9, 20, 30, 40, 50, 60, 70, 80, 90, 200, 300, 400, 500, 600, 700, 800, 900],
62+
minor=True)
63+
ax.set_yticklabels(["10", "100", "1000"])
64+
plt.tight_layout()
65+
66+
# %%
67+
save_figure("figure-s6-duration-cdf-cost-scenarios-ca-only.png")

0 commit comments

Comments
 (0)