"""
scenario_plots.py
Create a list of plots for comparing multiple scenarios.
"""
import os
import matplotlib.pyplot as plt
import pandas as pd
import cea.inputlocator
[docs]def plot_scenarios(scenarios, output_file):
"""
List each scenario in the folder `scenario_root` and plot demand and lca (operations, embodied) data.
:param scenarios: A list of scenario folders.
:param output_file: The filename (pdf) to save the results as.
:return: (None)
"""
from matplotlib.backends.backend_pdf import PdfPages
locators = [cea.inputlocator.InputLocator(scenario) for scenario in scenarios]
scenario_names = [os.path.basename(locator.scenario_path) for locator in locators]
pdf = PdfPages(output_file)
try:
create_page_demand(locators, pdf, scenario_names)
create_page_lca_embodied(locators, pdf, scenario_names)
create_page_lca_operation(locators, pdf, scenario_names)
finally:
pdf.close()
[docs]def create_page_lca_operation(locators, pdf, scenario_names):
"""
Create Page Three: LCA Operation
:param locators: list of InputLocators, one for each scenario
:param pdf: the PdfFile to write the page to
:param scenario_names: list of scenario names
:return: None
"""
try:
fig, axes = plt.subplots(nrows=2, figsize=(8.27, 11.69))
plt.suptitle('LCA Operation')
plot_lca_operation(axes[0], locators, scenario_names, column='O_nre_pen_MJm2',
title='Non-Renewable Primary Energy', unit='MJ/m2')
plot_lca_operation(axes[1], locators, scenario_names, column='O_ghg_kgm2', title='Greenhouse Gas', unit='kg/m2')
fig.subplots_adjust(hspace=0.5)
pdf.savefig()
finally:
plt.close()
[docs]def create_page_lca_embodied(locators, pdf, scenario_names):
"""
Create Page Two: LCA Embodied
:param locators: list of InputLocators, one for each scenario
:param pdf: the PdfFile to write the page to
:param scenario_names: list of scenario names
:return: None
"""
try:
fig, axes = plt.subplots(nrows=2, figsize=(8.27, 11.69))
plt.suptitle('LCA Embodied')
plot_lca_embodied(axes[0], locators, scenario_names, column='E_nre_pen_MJm2',
title='Non-Renewable Primary Energy', unit='MJ/m2')
plot_lca_embodied(axes[1], locators, scenario_names, column='E_ghg_kgm2', title='Greenhouse Gas', unit='kg/m2')
fig.subplots_adjust(hspace=0.5)
pdf.savefig()
finally:
plt.close()
[docs]def create_page_demand(locators, pdf, scenario_names):
"""
Create Page one: Demand
:param locators: list of InputLocators, one for each scenario
:param pdf: the PdfFile to write the page to
:param scenario_names: list of scenario names
:return: None
"""
try:
fig, axes = plt.subplots(nrows=3, figsize=(8.27, 11.69))
plt.suptitle('Demand')
plot_demand(axes[0], locators, scenario_names, column='Ef_MWhyr', title='Ef')
plot_demand(axes[1], locators, scenario_names, column='QHf_MWhyr', title='QH')
plot_demand(axes[2], locators, scenario_names, column='QCf_MWhyr', title='QC')
fig.subplots_adjust(hspace=0.5)
pdf.savefig()
finally:
plt.close()
[docs]def plot_demand(ax, locators, scenario_names, column, title):
df = pd.DataFrame()
afs = pd.DataFrame()
for i, scenario in enumerate(scenario_names):
scenario_data = pd.read_csv(locators[i].get_total_demand()).set_index('Name')
df[scenario] = scenario_data[column] * 1000 / scenario_data['GFA_m2']
afs[scenario] = scenario_data['GFA_m2']
ax2 = ax.twinx()
df.boxplot(ax=ax, sym='', return_type='axes')
ax.set_title(title)
ax.set_ylabel('Per Building [KWh/m2]')
y = pd.DataFrame({scenario: df[scenario] * afs[scenario] / afs[scenario].sum()
for scenario in scenario_names}).sum().ravel()
x = ax.get_xticks()
axylim = ax.get_ylim()
bottom = axylim[0] * 0.9
top = axylim[1] * 1.1
ax.set_ylim(bottom=bottom, top=top)
ax2.set_ylim(bottom=bottom, top=top)
plt.scatter(x, y, marker='D', color='g')
ax2.set_ylabel('Per Scenario [KWh/m2]')
[docs]def plot_lca_embodied(ax, locators, scenario_names, column, title, unit):
df = pd.DataFrame()
afs = pd.DataFrame()
for i, scenario in enumerate(scenario_names):
demand_data = pd.read_csv(locators[i].get_total_demand()).set_index('Name')
lca_data = pd.read_csv(locators[i].get_lca_embodied()).set_index('Name')
scenario_data = lca_data.merge(demand_data)
df[scenario] = scenario_data[column] * 1000 / scenario_data['GFA_m2']
afs[scenario] = scenario_data['GFA_m2']
ax2 = ax.twinx()
df.boxplot(ax=ax, sym='', return_type='axes')
ax.set_title(title)
ax.set_ylabel('Per Building [%(unit)s]' % locals())
y = pd.DataFrame({scenario: df[scenario] * afs[scenario] / afs[scenario].sum()
for scenario in scenario_names}).sum().ravel()
x = ax.get_xticks()
axylim = ax.get_ylim()
bottom = axylim[0] * 0.9
top = axylim[1] * 1.1
ax.set_ylim(bottom=bottom, top=top)
ax2.set_ylim(bottom=bottom, top=top)
plt.scatter(x, y, marker='D', color='g')
ax2.set_ylabel('Per Scenario [%(unit)s]' % locals())
[docs]def plot_lca_operation(ax, locators, scenario_names, column, title, unit):
df = pd.DataFrame()
afs = pd.DataFrame()
for i, scenario in enumerate(scenario_names):
demand_data = pd.read_csv(locators[i].get_total_demand()).set_index('Name')
lca_data = pd.read_csv(locators[i].get_lca_operation()).set_index('Name')
scenario_data = lca_data.merge(demand_data)
df[scenario] = scenario_data[column] * 1000 / scenario_data['GFA_m2']
afs[scenario] = scenario_data['GFA_m2']
ax2 = ax.twinx()
df.boxplot(ax=ax, sym='', return_type='axes')
ax.set_title(title)
ax.set_ylabel('Per Building [%(unit)s]' % locals())
y = pd.DataFrame({scenario: df[scenario] * afs[scenario] / afs[scenario].sum()
for scenario in scenario_names}).sum().ravel()
x = ax.get_xticks()
axylim = ax.get_ylim()
bottom = axylim[0] * 0.9
top = axylim[1] * 1.1
ax.set_ylim(bottom=bottom, top=top)
ax2.set_ylim(bottom=bottom, top=top)
plt.scatter(x, y, marker='D', color='g')
ax2.set_ylabel('Per Scenario [%(unit)s]' % locals())
[docs]def run_as_script(scenario_folders=None, output_file=None):
if not scenario_folders:
import cea.globalvar
gv = cea.globalvar.GlobalVariables()
scenario_folders = [gv.scenario_reference]
if not output_file:
output_file = os.path.expandvars(r'%TEMP%\scenario_plots.pdf')
plot_scenarios(scenario_folders, output_file)
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-s', '--scenarios', nargs='+', help='List of scenario folders', default=None)
parser.add_argument('-o', '--output', help='Output file', default=os.path.expandvars(r'%TEMP%\scenario_plots.pdf'))
args = parser.parse_args()
run_as_script(scenario_folders=args.scenarios, output_file=args.output)