Final for Paper

This commit is contained in:
Ludger Heide 2020-10-08 12:10:01 +02:00
parent e0df453875
commit eb0b99e969
8 changed files with 492 additions and 181 deletions

4
.gitignore vendored
View File

@ -237,5 +237,5 @@ dmypy.json
# Cython debug symbols
cython_debug/
out.xlsx
animation.mp4
output/*
!output/.keep

View File

@ -1,11 +1,6 @@
import itertools
import logging
import pandas as pd
import numpy as np
from celluloid import Camera
from scipy import stats
import seaborn as sns
from matplotlib import pyplot as plt
DEFAULT_AGES = np.arange(0, 50)
DEFAULT_MORTALITY_DISTRIBUTION = 5 * stats.exponweib(a=1, c=3, loc=0, scale=30).pdf(DEFAULT_AGES)
@ -53,6 +48,9 @@ def steady_state_population(mortality_distribution: np.array = None, total_popul
new_cars = ((old_population) + 0) - population_before_creation
population_distribution[0] = new_cars
if i > 1000:
raise Exception("Failed to converge after 1000 iterations!")
logger = logging.getLogger(__name__)
logger.info(f"Steady-state population achieved after {i} iterations.")
@ -103,52 +101,6 @@ def iterate(mortality_distribution: np.array, population_distribution: np.array,
return population_distribution
def plot_mortality(mortality_distribution = DEFAULT_MORTALITY_DISTRIBUTION, subsidy_distribution = None,
covid_distribution = None):
logging.basicConfig(level=logging.DEBUG)
plt.figure()
if subsidy_distribution is None:
plot_ = sns.barplot(np.arange(len(mortality_distribution)), mortality_distribution, color='cornflowerblue')
elif covid_distribution is None:
df = pd.DataFrame({"Ages": np.hstack((np.arange(len(mortality_distribution)), np.arange(len(mortality_distribution)))),
"label": list(itertools.chain(["Normal"]*len(mortality_distribution), ["With Subsidy"]*len(mortality_distribution))),
"Legend": np.hstack((mortality_distribution, subsidy_distribution))})
else:
df = pd.DataFrame({"Ages": np.hstack((np.arange(len(mortality_distribution)),
np.arange(len(mortality_distribution)),
np.arange(len(mortality_distribution)))),
"label": list(itertools.chain(["Normal"] * len(mortality_distribution),
["With Subsidy"] * len(mortality_distribution),
["With Covid"] * len(mortality_distribution))),
"Scenario": np.hstack((mortality_distribution,
subsidy_distribution,
covid_distribution))})
plot_ = sns.barplot(data=df, x="Ages", y="Scenario", hue="label")
plt.title("Mortality Distribution")
plt.ylabel("Recycling probability")
plt.xlabel("Age (years)")
for ind, label in enumerate(plot_.get_xticklabels()):
if ind % 10 == 0: # every 10th label is kept
label.set_visible(True)
else:
label.set_visible(False)
plt.show()
plt.close()
def plot_population(population_distribution: np.ndarray):
plt.figure()
plot_ = sns.barplot(np.arange(len(population_distribution)), population_distribution / 1e6, color='cornflowerblue')
plt.title("Population Distribution")
plt.ylabel("Vehicles (Millions)")
plt.xlabel("Age (years)")
for ind, label in enumerate(plot_.get_xticklabels()):
if ind % 10 == 0: # every 10th label is kept
label.set_visible(True)
else:
label.set_visible(False)
plt.show()
plt.close()
def sanity_check_for_subsidy():
population_distribution = steady_state_population()
@ -163,60 +115,3 @@ def sanity_check_for_subsidy():
assert np.abs((subsidy_new_cars - normal_year_new_cars) - 1e6) < 10000
def plot_population_development(years, total_pops: np.array):
# Plot total vehicle pop
plt.figure()
plot_ = sns.barplot(years, np.array(total_pops) / 1e6, color='cornflowerblue')
plt.title("Total Vehicle Population")
plt.ylabel("Vehicles (Millions)")
plt.xlabel("Simulation year")
plt.ylim(min(np.array(total_pops) / 1e6), max(np.array(total_pops) / 1e6))
for ind, label in enumerate(plot_.get_xticklabels()):
if ind % 10 == 0: # every 10th label is kept
label.set_visible(True)
else:
label.set_visible(False)
plt.show()
plt.close()
def plot_production(years, production: np.array):
df = pd.DataFrame({"Year": np.hstack((years, years)),
"Production": np.hstack((production, [production[0]]*len(years))),
"Scenario": itertools.chain([f"Subsidy ({np.sum(production)/1e6})"]*len(years), [f"Business as Usual ({(production[0]/1e6)*len(years)})"]*len(years))})
df.Production /= 1e6
# Plot total vehicle pop
plt.figure()
plot_ = sns.barplot(data=df, x="Year", y="Production", hue="Scenario")
plt.title("Total Vehicle Production")
plt.ylabel("Vehicles (Millions)")
plt.xlabel("Simulation year")
plt.ylim(0.8*min(np.array(production) / 1e6), 1.2*max(np.array(production) / 1e6))
for ind, label in enumerate(plot_.get_xticklabels()):
if ind % 10 == 0: # every 10th label is kept
label.set_visible(True)
else:
label.set_visible(False)
plt.show()
plt.close()
def animate(years, population_distributions):
ages = np.arange(len(population_distributions[0]))
fig = plt.figure()
camera = Camera(fig)
# animation draws one data point at a time
for i in range(len(population_distributions)):
plot_ = sns.barplot(ages, population_distributions[i] / 1e6, color='cornflowerblue')
plt.plot(ages, np.array(population_distributions[0]) / 1e6, color='blue')
for ind, label in enumerate(plot_.get_xticklabels()):
if ind % 10 == 0: # every 10th label is kept
label.set_visible(True)
else:
label.set_visible(False)
plt.title(f"Total Vehicle Population")
plt.ylabel("Vehicles (Millions)")
plt.xlabel("Vehicle Age")
camera.snap()
anim = camera.animate(blit=False)
anim.save('animation.mp4')

View File

@ -1,4 +1,9 @@
from util import *
from calculations import DEFAULT_MORTALITY_DISTRIBUTION, calculate_covid_mortality, calculate_subsidy_mortality, \
iterate, sanity_check_for_subsidy, \
steady_state_population
from visualization import animate, plot_mortality, plot_population, plot_population_development, plot_production
import numpy as np
import pandas as pd
if __name__ == "__main__":
sanity_check_for_subsidy()

75
load_real_data.py Normal file
View File

@ -0,0 +1,75 @@
from calculations import iterate
from calculations import steady_state_population
import pandas as pd
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
def real_mortality_distribution() -> np.ndarray:
df = pd.read_excel("input/mortality.xlsx")
mortality = np.array(df.Mortality)
mortality[np.where(mortality>0)[0]] = 0
mortality=np.hstack((mortality, mortality[-1]))
return np.array(-1*mortality)
def real_population_distribution(fraction_that_is_cars = 0.8413) -> np.ndarray:
df = pd.read_excel("input/age distribution.xlsx")
return np.array(df["Absolute Anzahl "])*fraction_that_is_cars
def population_distribution_deltas(fraction_that_is_cars = 0.8413) -> np.ndarray:
population_distribution = real_population_distribution()
mortality_distribution = real_mortality_distribution()
df = pd.read_excel("input/new registration numbers.xlsx")
years = np.arange(2020, 2031)
new_registrations = np.array(df["scenario without Covid"][1:])*fraction_that_is_cars
steady_state_registrationss = list()
correction_factors = list()
totals = list()
for i in range(len(years)):
steady_state_registrations = iterate(real_mortality_distribution(), population_distribution.copy())[0]
correction_factor = new_registrations[i]/steady_state_registrations
correction_factors.append(correction_factor)
population_distribution = iterate(real_mortality_distribution(), population_distribution, fraction_of_new_cars=correction_factor)
totals.append(sum(population_distribution))
steady_state_registrationss.append(steady_state_registrations)
df = pd.DataFrame({"Year": years,
"Predicted Regsitrations": new_registrations,
"Steady State Registrations": steady_state_registrationss,
"Correction Factor": correction_factors,
"Total": totals})
return df
if __name__ == "__main__":
mortality_distribution = real_mortality_distribution()
population_distribution = real_population_distribution()
steady_state_population_distribution = steady_state_population(mortality_distribution,
total_population=sum(population_distribution))
# Plot Age dtribution
if True:
plt.figure()
df = pd.DataFrame({"Age": np.hstack((np.arange(len(mortality_distribution)),
np.arange(len(mortality_distribution)))),
"Data": np.hstack((population_distribution/1e6,
steady_state_population_distribution/1e6)),
"Scenario": np.hstack((["KBA Data"]*len(mortality_distribution),
["Simulated Steady State"]*len(mortality_distribution)))})
plot_ = sns.barplot(data=df, x="Age", y="Data", hue="Scenario")
plt.title("Population Distribution")
plt.ylabel("Vehicles (Millions)")
plt.xlabel("Age (years)")
for ind, label in enumerate(plot_.get_xticklabels()):
if ind % 10 == 0: # every 10th label is kept
label.set_visible(True)
else:
label.set_visible(False)
plt.show()
plt.close()

31
optimized_mortality.py Normal file
View File

@ -0,0 +1,31 @@
import pickle
import numpy as np
from pyswarm import pso
from calculations import steady_state_population
from load_real_data import real_mortality_distribution, real_population_distribution
def optimized_mortality_distribution() -> np.ndarray:
population_distribution = real_population_distribution()
initial_mortality = real_mortality_distribution()
upper_bound = 0.20 * np.ones(initial_mortality.shape)
lower_bound = 0.01 * np.ones(initial_mortality.shape)
def _inner(x):
mortality = np.array(x)
try:
steady_state_population_distribution = steady_state_population(mortality,
total_population=sum(population_distribution))
except Exception:
return 1e100
population_error = np.sum(np.abs(steady_state_population_distribution-population_distribution))/sum(population_distribution)
return population_error
xopt, fopt = pso(_inner, lower_bound, upper_bound, swarmsize=1000, maxiter=100, debug=True)
with open("output/swarm-mortality.pickle", "wb") as fp:
pickle.dump(xopt, fp)
if __name__ == "__main__":
optimized_mortality_distribution()

253
scenarios.py Executable file
View File

@ -0,0 +1,253 @@
import pickle
import matplotlib
matplotlib.use("pgf")
matplotlib.rcParams.update({
"pgf.texsystem": "pdflatex",
'font.size' : 6.5,
'font.family' : 'lmodern',
'text.usetex': True,
'pgf.rcfonts': False,
})
import seaborn as sns
from calculations import calculate_covid_mortality, calculate_subsidy_mortality, iterate, steady_state_population
import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
from load_real_data import population_distribution_deltas, real_mortality_distribution, real_population_distribution
from visualization import plot_mortality
def no_premium_no_covid(population_distribution, mortality_distribution):
total_pops = list()
distribs = list()
production = list()
initial_pop_distrib = population_distribution
for i in range(len(years)):
fraction_of_new_cars = correction_factor[i]
population_distribution = iterate(mortality_distribution, population_distribution, fraction_of_new_cars)
distribs.append(population_distribution.copy())
total_pops.append(sum(population_distribution))
production.append(population_distribution[0])
df = pd.DataFrame(index=np.hstack((years[0]-1,years)), data=np.vstack((initial_pop_distrib, distribs)))
df.to_excel("output/no_premium_no_covid.xlsx")
return df
def no_premium_with_covid(population_distribution, mortality_distribution):
total_pops = list()
distribs = list()
production = list()
initial_pop_distrib = population_distribution
for i in range(len(years)):
fraction_of_new_cars = correction_factor[i]
if i == 0:
covid_mortality = calculate_covid_mortality(population_distribution, mortality_distribution)
population_distribution = iterate(covid_mortality, population_distribution, fraction_of_new_cars)
else:
population_distribution = iterate(mortality_distribution, population_distribution, fraction_of_new_cars)
distribs.append(population_distribution.copy())
total_pops.append(sum(population_distribution))
production.append(population_distribution[0])
df = pd.DataFrame(index=np.hstack((years[0]-1,years)), data=np.vstack((initial_pop_distrib, distribs)))
df.to_excel("output/no_premium_with_covid.xlsx")
return df
def premium_with_covid(population_distribution, mortality_distribution, subsidised_vehicle_count=1e6):
total_pops = list()
distribs = list()
production = list()
initial_pop_distrib = population_distribution
covid_mortality = calculate_covid_mortality(population_distribution, mortality_distribution)
subsidy_mortality = calculate_subsidy_mortality(population_distribution, mortality_distribution, total_cars=subsidised_vehicle_count)
for i in range(len(years)):
fraction_of_new_cars = correction_factor[i]
if i == 0:
population_distribution = iterate(covid_mortality, population_distribution, fraction_of_new_cars)
elif i == 1:
population_distribution = iterate(subsidy_mortality, population_distribution, fraction_of_new_cars)
else:
population_distribution = iterate(mortality_distribution, population_distribution, fraction_of_new_cars)
distribs.append(population_distribution.copy())
total_pops.append(sum(population_distribution))
production.append(population_distribution[0])
df = pd.DataFrame(index=np.hstack((years[0]-1,years)), data=np.vstack((initial_pop_distrib, distribs)))
df.to_excel(f"output/with_premium_with_covid_{subsidised_vehicle_count}.xlsx")
return df
if __name__ == "__main__":
mortality_distribution = real_mortality_distribution()
#mortality_distribution = np.convolve(mortality_distribution, np.ones((3,))/3, mode='valid') # TODO: Remove
population_distribution = real_population_distribution()
steady_state_population_distribution = steady_state_population(mortality_distribution,
total_population=sum(population_distribution))
# population_distribution = steady_state_population_distribution #TODO: Remove
years = population_distribution_deltas()["Year"]
correction_factor = population_distribution_deltas()["Correction Factor"]
# correction_factor = np.ones(correction_factor.shape) # TODO: Remove
if True:
sns.set_palette(sns.color_palette(("grey", "firebrick", "peru", "darkorange", "gold")))
plt.figure()
df = pd.DataFrame({"Age": np.hstack((np.arange(len(mortality_distribution)),
np.arange(len(mortality_distribution)))),
"Data": np.hstack((population_distribution / 1e6,
steady_state_population_distribution / 1e6)),
"Scenario": np.hstack((["Actual Data 2019"] * len(mortality_distribution),
["Using Normal Deregistration"] * len(mortality_distribution)))})
plot_ = sns.lineplot(data=df, x="Age", y="Data", hue="Scenario")
plt.title("In-Scope Population Distribution")
plt.ylabel("Vehicles (Millions)")
plt.xlabel("Age (years)")
#for ind, label in enumerate(plot_.get_xticklabels()):
# if ind % 10 == 0: # every 10th label is kept
# label.set_visible(True)
# else:
# label.set_visible(False)
plt.savefig("output/population.png")
plt.savefig("output/population.pgf")
plt.show()
plt.close()
production = list()
year = list()
title = list()
total_production = list()
total_title = list()
df = no_premium_no_covid(population_distribution.copy(), mortality_distribution)
production.extend(df[0]/1e6)
year.extend(df.index)
title.extend(["No Covid, No Premium"]*len(df.index))
total_production.append(np.sum(df[0][1:]/1e6))
total_title.append("No Covid,\nNo Premium")
df = no_premium_with_covid(population_distribution.copy(), mortality_distribution)
production.extend(df[0]/1e6)
year.extend(df.index)
title.extend(["With Covid, No Premium"]*len(df.index))
total_production.append(np.sum(df[0][1:]/1e6))
total_title.append("With Covid,\nNo Premium")
subsidy_count = production[1]*1e6-df[0][2020]
df = premium_with_covid(population_distribution.copy(), mortality_distribution, subsidised_vehicle_count=subsidy_count)
production.extend(df[0]/1e6)
year.extend(df.index)
title.extend([f"Covid, Premium ({subsidy_count/1e6:.2f}M vehicles)"]*len(df.index))
total_production.append(np.sum(df[0][1:]/1e6))
total_title.append(f"Covid,\nPremium\n({subsidy_count/1e6:.2f}M\nvehicles)")
subsidy_count*=2
df = premium_with_covid(population_distribution.copy(), mortality_distribution, subsidised_vehicle_count=subsidy_count)
production.extend(df[0]/1e6)
year.extend(df.index)
title.extend([f"Covid, Premium ({subsidy_count/1e6:.2f}M vehicles)"]*len(df.index))
total_production.append(np.sum(df[0][1:]/1e6))
total_title.append(f"Covid,\nPremium\n({subsidy_count/1e6:.2f}M\nvehicles)")
subsidy_count*=2
df = premium_with_covid(population_distribution.copy(), mortality_distribution, subsidised_vehicle_count=subsidy_count)
production.extend(df[0]/1e6)
year.extend(df.index)
title.extend([f"Covid, Premium ({subsidy_count/1e6:.2f}M vehicles)"]*len(df.index))
total_production.append(np.sum(df[0][1:]/1e6))
total_title.append(f"Covid,\nPremium\n({subsidy_count/1e6:.2f}M\nvehicles)")
if True:
sns.set_palette(sns.color_palette(("grey", "firebrick", "peru", "darkorange", "gold")))
plt.figure(figsize=(6.5, 4))
df = pd.DataFrame({"Ages": np.hstack((np.arange(len(mortality_distribution)),
np.arange(len(mortality_distribution)),
np.arange(len(mortality_distribution)),
np.arange(len(mortality_distribution)),
np.arange(len(mortality_distribution)))),
"Case": np.hstack((["No Covid, No Premium"]*len(mortality_distribution),
["With Covid, No Premium"]*len(mortality_distribution),
[f"Covid, Premium ({subsidy_count/4e6:.2f}M vehicles)"]*len(mortality_distribution),
[f"Covid, Premium ({subsidy_count/2e6:.2f}M vehicles)"]*len(mortality_distribution),
[f"Covid, Premium ({subsidy_count/1e6:.2f}M vehicles)"]*len(mortality_distribution))),
"Scenario": np.hstack((mortality_distribution,
calculate_covid_mortality(population_distribution, mortality_distribution),
calculate_subsidy_mortality(population_distribution, mortality_distribution, total_cars=subsidy_count/4),
calculate_subsidy_mortality(population_distribution, mortality_distribution, total_cars=subsidy_count/2),
calculate_subsidy_mortality(population_distribution, mortality_distribution, total_cars=subsidy_count)))})
plot_ = sns.lineplot(data=df, x="Ages", y="Scenario", hue="Case")
plot_.grid(b=True)
#plt.title("Deregistration Distribution")
plt.ylabel("Recycling probability")
plt.xlabel("Age (years)")
# for ind, label in enumerate(plot_.get_xticklabels()):
# if ind % 10 == 0: # every 10th label is kept
# label.set_visible(True)
# else:
# label.set_visible(False)
plt.savefig("output/mortality.png")
plt.savefig("output/mortality.pgf")
plt.show()
plt.close()
if True:
sns.set_palette(sns.color_palette(("grey", "firebrick", "peru", "darkorange", "gold")))
plt.figure(figsize=(6.5, 2.5))
plt.subplot(121)
df = pd.DataFrame({"Year": year,
"Data": production,
"Scenario": title})
plot_ = sns.lineplot(data=df, x="Year", y="Data", hue="Scenario")
plot_.legend().set_visible(False)
plot_.grid(b=True)
plt.title("In-Scope Vehice Registrations per Year")
plt.ylabel("Vehicles (Millions)")
plt.xlabel("Year")
#for ind, label in enumerate(plot_.get_xticklabels()):
# if ind % 10 == 0: # every 10th label is kept
# label.set_visible(True)
# else:
# label.set_visible(False)
sns.set_palette(sns.color_palette(("grey", "firebrick", "peru", "darkorange", "gold")))
plt.subplot(122)
df = pd.DataFrame({"Data": total_production,
"Scenario": total_title})
plot_ = sns.barplot(data=df, x="Scenario", y="Data")
plot_.grid(b=True, axis='y')
plt.ylim(min(np.array(total_production))*0.99, max(np.array(total_production))*1.01)
plt.title("In-Scope Vehicle Registrations 2020-2030")
plt.ylabel("Vehicles (Millions)")
#plt.xlabel("Sce")
#for ind, label in enumerate(plot_.get_xticklabels()):
# if ind % 10 == 0: # every 10th label is kept
# label.set_visible(True)
# else:
# label.set_visible(False)
plt.tight_layout()
plt.savefig("output/productions.png")
plt.savefig("output/productions.pgf")
plt.show()
plt.close()

View File

@ -1,71 +1 @@
from util import *
def real_mortality_distribution() -> np.ndarray:
df = pd.read_excel("mortality.xlsx")
mortality = df.Mortality
mortality[0] = 0
mortality[1] = 0
mortality[2] = 0
mortality[32:38] = mortality[31]
mnp.hstack((mortality, mortality[31]))
return np.array(-1*mortality)
def real_population_distribution() -> np.ndarray:
df = pd.read_excel("age distribution.xlsx")
return np.array(df["Absolute Anzahl "])
def population_distribution_deltas() -> np.ndarray:
population_distribution = real_population_distribution()
mortality_distribution = real_mortality_distribution()
df = pd.read_excel("new registration numbers.xlsx")
years = np.arange(2020, 2031)
new_registrations = np.array(df["scenario without Covid"][1:])
steady_state_registrationss = list()
correction_factors = list()
totals = list()
for i in range(len(years)):
steady_state_registrations = iterate(real_mortality_distribution(), population_distribution.copy())[0]
correction_factor = new_registrations[i]/steady_state_registrations
correction_factors.append(correction_factor)
population_distribution = iterate(real_mortality_distribution(), population_distribution, fraction_of_new_cars=correction_factor)
totals.append(sum(population_distribution))
steady_state_registrationss.append(steady_state_registrations)
df = pd.DataFrame({"Year": years,
"Predicted Regsitrations": new_registrations,
"Steady State Registrations": steady_state_registrationss,
"Correction Factor": correction_factors,
"Total": totals})
return correction_factors
if __name__ == "__main__":
mortality_distribution = real_mortality_distribution()
population_distribution = real_population_distribution()
steady_state_population_distribution = steady_state_population(mortality_distribution,
total_population=sum(population_distribution))
if True:
plt.figure()
df = pd.DataFrame({"Age": np.hstack((np.arange(len(mortality_distribution)),
np.arange(len(mortality_distribution)))),
"Data": np.hstack((population_distribution/1e6,
steady_state_population_distribution/1e6)),
"Scenario": np.hstack((["KBA Data"]*len(mortality_distribution),
["Simulated Steady State"]*len(mortality_distribution)))})
plot_ = sns.barplot(data=df, x="Age", y="Data", hue="Scenario")
plt.title("Population Distribution")
plt.ylabel("Vehicles (Millions)")
plt.xlabel("Age (years)")
for ind, label in enumerate(plot_.get_xticklabels()):
if ind % 10 == 0: # every 10th label is kept
label.set_visible(True)
else:
label.set_visible(False)
plt.show()
plt.close()
population_distribution_deltas()

122
visualization.py Normal file
View File

@ -0,0 +1,122 @@
import itertools
import logging
import numpy as np
import pandas as pd
import seaborn as sns
from celluloid import Camera
from matplotlib import pyplot as plt
from calculations import DEFAULT_MORTALITY_DISTRIBUTION
def plot_mortality(mortality_distribution = DEFAULT_MORTALITY_DISTRIBUTION, subsidy_distribution = None,
covid_distribution = None):
logging.basicConfig(level=logging.DEBUG)
plt.figure()
if subsidy_distribution is None:
plot_ = sns.barplot(np.arange(len(mortality_distribution)), mortality_distribution, color='cornflowerblue')
elif covid_distribution is None:
df = pd.DataFrame({"Ages": np.hstack((np.arange(len(mortality_distribution)), np.arange(len(mortality_distribution)))),
"label": list(itertools.chain(["Normal"]*len(mortality_distribution), ["With Subsidy"]*len(mortality_distribution))),
"Legend": np.hstack((mortality_distribution, subsidy_distribution))})
else:
df = pd.DataFrame({"Ages": np.hstack((np.arange(len(mortality_distribution)),
np.arange(len(mortality_distribution)),
np.arange(len(mortality_distribution)))),
"Case": list(itertools.chain(["Normal"] * len(mortality_distribution),
["With Subsidy"] * len(mortality_distribution),
["With Covid"] * len(mortality_distribution))),
"Scenario": np.hstack((mortality_distribution,
subsidy_distribution,
covid_distribution))})
plot_ = sns.lineplot(data=df, x="Ages", y="Scenario", hue="Case")
plt.title("Deregistration Distribution")
plt.ylabel("Recycling probability")
plt.xlabel("Age (years)")
#for ind, label in enumerate(plot_.get_xticklabels()):
# if ind % 10 == 0: # every 10th label is kept
# label.set_visible(True)
# else:
# label.set_visible(False)
plt.savefig("output/mortality.png")
plt.savefig("output/mortality.pgf")
plt.show()
plt.close()
def plot_population(population_distribution: np.ndarray):
plt.figure()
plot_ = sns.barplot(np.arange(len(population_distribution)), population_distribution / 1e6, color='cornflowerblue')
plt.title("Population Distribution")
plt.ylabel("Vehicles (Millions)")
plt.xlabel("Age (years)")
for ind, label in enumerate(plot_.get_xticklabels()):
if ind % 10 == 0: # every 10th label is kept
label.set_visible(True)
else:
label.set_visible(False)
plt.show()
plt.close()
def plot_population_development(years, total_pops: np.array):
# Plot total vehicle pop
plt.figure()
plot_ = sns.barplot(years, np.array(total_pops) / 1e6, color='cornflowerblue')
plt.title("Total Vehicle Population")
plt.ylabel("Vehicles (Millions)")
plt.xlabel("Simulation year")
plt.ylim(min(np.array(total_pops) / 1e6), max(np.array(total_pops) / 1e6))
for ind, label in enumerate(plot_.get_xticklabels()):
if ind % 10 == 0: # every 10th label is kept
label.set_visible(True)
else:
label.set_visible(False)
plt.show()
plt.close()
def plot_production(years, production: np.array):
df = pd.DataFrame({"Year": np.hstack((years, years)),
"Production": np.hstack((production, [production[0]]*len(years))),
"Scenario": itertools.chain([f"Subsidy ({np.sum(production)/1e6})"]*len(years), [f"Business as Usual ({(production[0]/1e6)*len(years)})"]*len(years))})
df.Production /= 1e6
# Plot total vehicle pop
plt.figure()
plot_ = sns.barplot(data=df, x="Year", y="Production", hue="Scenario")
plt.title("Total Vehicle Production")
plt.ylabel("Vehicles (Millions)")
plt.xlabel("Simulation year")
plt.ylim(0.8*min(np.array(production) / 1e6), 1.2*max(np.array(production) / 1e6))
for ind, label in enumerate(plot_.get_xticklabels()):
if ind % 10 == 0: # every 10th label is kept
label.set_visible(True)
else:
label.set_visible(False)
plt.show()
plt.close()
def animate(years, population_distributions):
ages = np.arange(len(population_distributions[0]))
fig = plt.figure()
camera = Camera(fig)
# animation draws one data point at a time
for i in range(len(population_distributions)):
plot_ = sns.barplot(ages, population_distributions[i] / 1e6, color='cornflowerblue')
plt.plot(ages, np.array(population_distributions[0]) / 1e6, color='blue')
for ind, label in enumerate(plot_.get_xticklabels()):
if ind % 10 == 0: # every 10th label is kept
label.set_visible(True)
else:
label.set_visible(False)
plt.title(f"Total Vehicle Population")
plt.ylabel("Vehicles (Millions)")
plt.xlabel("Vehicle Age")
camera.snap()
anim = camera.animate(blit=False)
anim.save('animation.mp4')