CLIMADA features

The functionality of climada is gathered in the following classes:

  • Entity: socio-economic models

  • Exposures: exposed values

    • BlackMarble: regional economic model from nightlight intensities and economic indicators (GDP, income group)

    • LitPop: regional economic model using nightlight and population maps together with several economic indicators

  • ImpactFuncSet: collection of impact functions per hazard

    • ImpactFunc: one adjustable impact function

    • IFTropCyclone: definition of impact functions for tropical cyclones

  • DiscRates: discount rates per year

  • MeasureSet: collection of measures for adaptation

    • Measure: one configurable measure

  • Hazard: meteorological models

  • TropCyclone: tropical cyclone events

  • Impact: impacts of the Hazard and Entity interaction

  • CostBenefit: adaptation options appraisal

Risk assessment

Entity

The entity class is just a container for the exposures, impact functions, discount rates and measures. It can be directly filled from an excel file following climada’s template or from MATLAB files of the climada MATLAB version. The excel template can be found in climada_python/data/system/entity_template.xlsx.

[1]:
from climada.entity import Entity
from climada.util.constants import ENT_DEMO_TODAY

# absolute path of file following template.
ent_file = ENT_DEMO_TODAY
ent_fl = Entity()
ent_fl.read_excel(ent_file)
2019-06-18 17:43:20,788 - climada - DEBUG - Loading default config file: /Users/aznarsig/Documents/Python/climada_python/climada/conf/defaults.conf

Every class has a check() method. This verifies that the necessary data to compute the impact is correctly provided and logs the optional variables that are not present. Use it always after filling an instance.

[2]:
ent_fl.check() # checks exposures, impact functions, discount rates and measures
2019-06-18 17:43:22,894 - climada.entity.exposures.base - INFO - crs set to default value: {'init': 'epsg:4326', 'no_defs': True}
2019-06-18 17:43:22,896 - climada.entity.exposures.base - INFO - ref_year metadata set to default value: 2018
2019-06-18 17:43:22,897 - climada.entity.exposures.base - INFO - value_unit metadata set to default value: USD
2019-06-18 17:43:22,897 - climada.entity.exposures.base - INFO - meta metadata set to default value: None
2019-06-18 17:43:22,898 - climada.entity.exposures.base - INFO - centr_ not set.
2019-06-18 17:43:22,899 - climada.entity.exposures.base - INFO - category_id not set.
2019-06-18 17:43:22,900 - climada.entity.exposures.base - INFO - region_id not set.
2019-06-18 17:43:22,901 - climada.entity.exposures.base - INFO - geometry not set.

Exposures

The Entity’s exposures attribute contains geolocalized values of anything exposed to the hazard, let it be monetary value of assets or number of human lifes, for example. It is of type Exposures.

See Exposures tutorial to learn how to fill and use exposures.

See LitPop to model economic exposures using night-time light and population densitites. See BlackMarble to model economic exposures based only on night-time light intensities.

[3]:
%matplotlib inline
ent_fl.exposures.plot_basemap(buffer=50000.0); # exposures in Florida
2019-06-18 17:43:22,910 - climada.entity.exposures.base - INFO - Setting geometry points.
2019-06-18 17:43:22,927 - climada.entity.exposures.base - INFO - Setting latitude and longitude attributes.
/Users/aznarsig/anaconda3/envs/climada_up/lib/python3.7/site-packages/matplotlib/tight_layout.py:176: UserWarning: Tight layout not applied. The left and right margins cannot be made large enough to accommodate all axes decorations.
  warnings.warn('Tight layout not applied. The left and right margins '
2019-06-18 17:43:24,030 - climada.entity.exposures.base - INFO - Setting latitude and longitude attributes.
../_images/tutorial_1_main_climada_8_3.png

Impact Functions

The impact_funcs attribute is of type ImpactFuncSet. As such, it contains impact functions for different hazards.

See Impact Functions tutorial to learn how to handle this class.

[4]:
ent_fl.impact_funcs.plot('TC'); # tropical cyclone impact functions
../_images/tutorial_1_main_climada_10_0.png

Adaptation Measures

The measures attribute is of type MeasureSet. This class is a container of Measure instances, similarly to ImpactFuncSet containing several ImpactFunc. Adaptation measures aim to decrease hazards impacts and are subjected to a cost.

See Adaptation Measures to learn to handle measures.

[5]:
# print measures names
print(ent_fl.measures.get_names())
{'TC': ['Mangroves', 'Beach nourishment', 'Seawall', 'Building code']}

Discount Rates

The disc_rates attribute is of type DiscRates. This class contains the discount rates for the following years and computes the net present value for given values.

See Discount Rates.

[6]:
ent_fl.disc_rates.plot()
[6]:
(<Figure size 288x288 with 1 Axes>,
 [<matplotlib.axes._subplots.AxesSubplot at 0x1a24ac9c88>])
../_images/tutorial_1_main_climada_14_1.png

Hazard

Hazards are characterized by their frequency of occurrence and the geographical distribution of their intensity. A Hazard instance collects events of the same hazard type (e.g. tropical cyclone, flood, drought, …) over the same centroids. They might be historical events or synthetic.

See Hazard to learn how to handle hazards.

See TropCyclone to learn to model tropical cyclones.

A complete set of tropical cyclones events in Florida can be found in file HAZ_DEMO_MAT. This contains 1445 historical events from year 1851 to 2011 and 9 synthetic events for each historical one.

[7]:
from climada.hazard import Hazard
from climada.util import HAZ_DEMO_MAT
tc_fl = Hazard('TC')
tc_fl.read_mat(HAZ_DEMO_MAT, 'Historic and synthetic tropical cyclones in Florida from 1851 to 2011.')
tc_fl.plot_intensity('ANDREW') # plot intensity of hurricanes Andrew
print('Two hurricanes called Andrew happened in ', tc_fl.get_event_date('ANDREW'))
2019-06-18 17:43:24,964 - climada.hazard.base - INFO - Reading /Users/aznarsig/Documents/Python/climada_python/data/demo/atl_prob.mat
2019-06-18 17:43:25,021 - climada.hazard.centroids.centr - INFO - Reading /Users/aznarsig/Documents/Python/climada_python/data/demo/atl_prob.mat
/Users/aznarsig/anaconda3/envs/climada_up/lib/python3.7/site-packages/matplotlib/tight_layout.py:176: UserWarning: Tight layout not applied. The left and right margins cannot be made large enough to accommodate all axes decorations.
  warnings.warn('Tight layout not applied. The left and right margins '
Two hurricanes called Andrew happened in  ['1986-06-05', '1992-08-16']
../_images/tutorial_1_main_climada_17_3.png

Impact

The impact of hazard events over an entity can be computed easily from the previously explained classes. By computing the impact for each event (historical and synthetic), the Impact class provides different risk measures, as the expected annual impact per exposure, the probable maximum impact for different return periods and the total average annual impact.

Let us compute the impact of tropical cyclones over the exposures selected in Florida.

The configurable parameter MAX_SIZE controls the maximum matrix size contained in a chunk. You can decrease its value if you are having memory issues when using the Impact’s calc method. A high value will make the computation fast, but increase the memory use. The configuration file is located at climada_python/climada/conf/defaults.conf.

[8]:
from climada.engine import Impact

imp_fl = Impact()
imp_fl.calc(ent_fl.exposures, ent_fl.impact_funcs, tc_fl)

freq_curve_fl = imp_fl.calc_freq_curve() # impact exceedence frequency curve
freq_curve_fl.plot();

print('Expected average annual impact: {:.3e} USD'.format(imp_fl.aai_agg))

imp_fl.plot_basemap_eai_exposure(buffer=50000.0); # average annual impact at each exposure
2019-06-18 17:43:35,127 - climada.entity.exposures.base - INFO - Matching 50 exposures with 100 centroids.
2019-06-18 17:43:35,167 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
Expected average annual impact: 6.512e+09 USD
2019-06-18 17:43:35,223 - climada.entity.exposures.base - INFO - tag metadata set to default value:  File:
 Description:
2019-06-18 17:43:35,224 - climada.entity.exposures.base - INFO - ref_year metadata set to default value: 2018
2019-06-18 17:43:35,224 - climada.entity.exposures.base - INFO - meta metadata set to default value: None
2019-06-18 17:43:35,225 - climada.entity.exposures.base - INFO - Setting if_ to default impact functions ids 1.
2019-06-18 17:43:35,227 - climada.entity.exposures.base - INFO - centr_ not set.
2019-06-18 17:43:35,228 - climada.entity.exposures.base - INFO - deductible not set.
2019-06-18 17:43:35,229 - climada.entity.exposures.base - INFO - cover not set.
2019-06-18 17:43:35,229 - climada.entity.exposures.base - INFO - category_id not set.
2019-06-18 17:43:35,230 - climada.entity.exposures.base - INFO - region_id not set.
2019-06-18 17:43:35,231 - climada.entity.exposures.base - INFO - geometry not set.
2019-06-18 17:43:35,232 - climada.entity.exposures.base - INFO - Setting geometry points.
2019-06-18 17:43:35,239 - climada.entity.exposures.base - INFO - Setting latitude and longitude attributes.
/Users/aznarsig/anaconda3/envs/climada_up/lib/python3.7/site-packages/matplotlib/tight_layout.py:176: UserWarning: Tight layout not applied. The left and right margins cannot be made large enough to accommodate all axes decorations.
  warnings.warn('Tight layout not applied. The left and right margins '
2019-06-18 17:43:36,200 - climada.entity.exposures.base - INFO - Setting latitude and longitude attributes.
../_images/tutorial_1_main_climada_21_3.png
../_images/tutorial_1_main_climada_21_4.png

We can save our variables in pickle format using the save function. This will save your results in the folder specified in the configuration file. The default folder is a results folder which is created in the current path.

[9]:
from climada.util import save
save('impact_florida.p', imp_fl)

# Later, the data can be read as follows:
import pickle
import os
abs_path = os.path.join(os.getcwd(), 'results/impact_florida.p') # absolute path
with open(abs_path, 'rb') as f:
    data = pickle.load(f)

print('Data read:', type(data))
2019-06-18 17:43:36,605 - climada.util.save - INFO - Created folder /Users/aznarsig/Documents/Python/tutorial/results.
2019-06-18 17:43:36,610 - climada.util.save - INFO - Written file /Users/aznarsig/Documents/Python/tutorial/results/impact_florida.p
Data read: <class 'climada.engine.impact.Impact'>

Impact also has write_csv() and write_excel() methods to save the impact variables, and write_sparse_csr() to save the impact matrix (impact per event and exposure). Use the class doc to get more information about these functions.

See Impact to learn more about impact calculations.

Adaptation options appraisal

The adaptation measures defined before can be valued by estimating its cost-benefit ratio. This is done in the class CostBenefit.

Let us suppose that the socioeconomic and climatoligical conditions remain the same in 2040. We then compute the cost and benefit of every adaptation measure as follows:

[10]:
from climada.engine import CostBenefit

cost_ben = CostBenefit()
cost_ben.calc(tc_fl, ent_fl, future_year=2040) # prints costs and benefits
cost_ben.plot_cost_benefit() # plot cost benefit ratio and averted damage of every exposure
cost_ben.plot_event_view() # plot averted damage of each measure for every return period
2019-06-18 17:43:36,622 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:36,625 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:36,665 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:36,667 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:36,693 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:36,694 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:36,721 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:36,723 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:36,911 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:36,914 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:36,959 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:36,961 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:36,989 - climada.engine.cost_benefit - INFO - Computing cost benefit from years 2018 to 2040.

Measure              Cost (USD bn)    Benefit (USD bn)    Benefit/Cost
-----------------  ---------------  ------------------  --------------
Mangroves                  1.31177             31.0058        23.6367
Beach nourishment          1.728               24.6898        14.2881
Seawall                    8.87878             33.133          3.7317
Building code              9.2                 30.3762         3.30177

--------------------  --------  --------
Total climate risk:   121.505   (USD bn)
Average annual risk:    6.5122  (USD bn)
Residual damage:        2.3001  (USD bn)
--------------------  --------  --------
[10]:
(<Figure size 432x288 with 1 Axes>,
 <matplotlib.axes._subplots.AxesSubplot at 0x1c2d0aa1d0>)
../_images/tutorial_1_main_climada_28_2.png
../_images/tutorial_1_main_climada_28_3.png

Let us now assume that the exposure evolves according to ENT_DEMO_FUTURE in 2040 and that the intensity of the hazards increase uniformly due to climate change.

[11]:
import copy
from climada.util.constants import ENT_DEMO_FUTURE

# future conditions
ent_future = Entity()
ent_future.read_excel(ENT_DEMO_FUTURE)
ent_future.check()
ent_future.exposures.ref_year = 2040

haz_future = copy.deepcopy(tc_fl)
haz_future.intensity.data += 15  # increase uniformly the intensity

cost_ben = CostBenefit()
cost_ben.calc(tc_fl, ent_fl, haz_future, ent_future)
cost_ben.plot_cost_benefit() # plot cost benefit ratio and averted damage of every exposure
cost_ben.plot_event_view() # plot averted damage of each measure for every return period
fig, ax = cost_ben.plot_waterfall(tc_fl, ent_fl, haz_future, ent_future) # plot expected annual impact
ax.set_title('Expected Annual Impact in 2015 and 2040')
cost_ben.plot_waterfall_accumulated(tc_fl, ent_fl, haz_future, ent_future) # plot accumulated impact from present to future
2019-06-18 17:43:37,372 - climada.entity.exposures.base - INFO - crs set to default value: {'init': 'epsg:4326', 'no_defs': True}
2019-06-18 17:43:37,373 - climada.entity.exposures.base - INFO - ref_year metadata set to default value: 2018
2019-06-18 17:43:37,373 - climada.entity.exposures.base - INFO - value_unit metadata set to default value: USD
2019-06-18 17:43:37,374 - climada.entity.exposures.base - INFO - meta metadata set to default value: None
2019-06-18 17:43:37,375 - climada.entity.exposures.base - INFO - centr_ not set.
2019-06-18 17:43:37,376 - climada.entity.exposures.base - INFO - category_id not set.
2019-06-18 17:43:37,377 - climada.entity.exposures.base - INFO - region_id not set.
2019-06-18 17:43:37,378 - climada.entity.exposures.base - INFO - geometry not set.
2019-06-18 17:43:37,390 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:37,391 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:37,418 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:37,420 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:37,442 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:37,444 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:37,466 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:37,468 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:37,704 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:37,706 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:37,738 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:37,739 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:37,766 - climada.entity.exposures.base - INFO - Matching 50 exposures with 100 centroids.
2019-06-18 17:43:37,770 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:37,804 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:37,806 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:37,837 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:37,839 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:37,870 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:37,872 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:38,079 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:38,081 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:38,109 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:38,111 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:38,150 - climada.engine.cost_benefit - INFO - Computing cost benefit from years 2018 to 2040.

Measure              Cost (USD bn)    Benefit (USD bn)    Benefit/Cost
-----------------  ---------------  ------------------  --------------
Mangroves                  1.31177             80.0097        60.9938
Beach nourishment          1.728               63.3336        36.6514
Seawall                    8.87878            164.132         18.4858
Building code              9.2                 90.2786         9.81289

--------------------  --------  --------
Total climate risk:   361.115   (USD bn)
Average annual risk:   34.3977  (USD bn)
Residual damage:      -36.6389  (USD bn)
--------------------  --------  --------
2019-06-18 17:43:38,224 - climada.engine.cost_benefit - INFO - Risk at 2018: 6.512e+09
2019-06-18 17:43:38,225 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:38,229 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:38,263 - climada.engine.cost_benefit - INFO - Risk with development at 2040: 1.302e+10
2019-06-18 17:43:38,264 - climada.engine.cost_benefit - INFO - Risk with development and climate change at 2040: 3.440e+10
2019-06-18 17:43:38,281 - climada.engine.cost_benefit - INFO - Current total risk at 2040: 1.215e+11
2019-06-18 17:43:38,282 - climada.engine.impact - INFO - Exposures matching centroids found in centr_TC
2019-06-18 17:43:38,286 - climada.engine.impact - INFO - Calculating damage for 50 assets (>0) and 14450 events.
2019-06-18 17:43:38,322 - climada.engine.cost_benefit - INFO - Total risk with development at 2040: 1.775e+11
2019-06-18 17:43:38,323 - climada.engine.cost_benefit - INFO - Total risk with development and climate change at 2040: 3.611e+11
[11]:
(<Figure size 432x288 with 1 Axes>,
 <matplotlib.axes._subplots.AxesSubplot at 0x1c2ed3cf28>)
../_images/tutorial_1_main_climada_30_2.png
../_images/tutorial_1_main_climada_30_3.png
../_images/tutorial_1_main_climada_30_4.png
../_images/tutorial_1_main_climada_30_5.png

Check what happens when different parameters are changed, such as the imp_time_depen and risk_func in CostBenefit.calc() (and plot_waterfall(), plot_waterfall_accumulated())

Your case

  1. Build an entity. It might be one from your previous runs in MATLAB. Make sure i’is saved in version > v7.3 if it’s a MATLAB file. If it’s not, you’ll get an error message. Then, you can save it again in MATLAB like that: save('file_name.mat','variable_name', '-v7.3')

  2. Build a hazard. It might also come from a previous run in MATLAB. This file might already contain the centroids. If not, define the centroids as well and use them in your calculations.

  3. Compute the impact.

  4. Visualization. Plot:

  • the damage functions for the hazard

  • the entity values map

  • the strongest event intensity

  • the maximum hazard intensity of all the events in Zürich (47.38, 8.54)

  • the impact exceedence frequency curve

[12]:
# Put your code here





[13]:
# SOLUTION: example: winter storms in europe
from climada.util import DATA_DIR
import pandas as pd
from climada.hazard import Hazard
from climada.entity import Exposures, ImpactFuncSet
from climada.engine import Impact

# Put any absoulte path for your files or set up the configuration variable "repository"
FILE_HAZARD = DATA_DIR + '/demo/WS_ERA40.mat'
FILE_ENTITY = DATA_DIR + '/demo/WS_Europe.xls'

# Define hazard type
HAZ_TYPE = 'WS'

# 1. Entity: we only need impact functions and exposures to compute the impact
# Exposures
exp_ws_eu = pd.read_excel(FILE_ENTITY)
exp_ws_eu = Exposures(exp_ws_eu)
exp_ws_eu.check()

# Impact functions
impf_ws_eu = ImpactFuncSet()
impf_ws_eu.read_excel(FILE_ENTITY, 'Impact functions for winter storms in EU.')

# 2. Hazard
haz_ws_eu = Hazard(HAZ_TYPE)
haz_ws_eu.read_mat(FILE_HAZARD, 'WS EU ERA 40')

# 3. Impact
imp_ws_eu = Impact()
imp_ws_eu.calc(exp_ws_eu, impf_ws_eu, haz_ws_eu)

# 4.
# the damage functions for the hazard
impf_ws_eu.plot()

# the exposures values map
exp_ws_eu.plot_hexbin(pop_name=False)

# the strongest event
haz_ws_eu.plot_intensity(-1) # might be better to use an other earth projection?

# the impact exceedence frequency curve
imp_exc_curve = imp_ws_eu.calc_freq_curve()
imp_exc_curve.plot()
2019-06-18 17:43:39,222 - climada.entity.exposures.base - INFO - crs set to default value: {'init': 'epsg:4326', 'no_defs': True}
2019-06-18 17:43:39,223 - climada.entity.exposures.base - INFO - tag metadata set to default value:  File:
 Description:
2019-06-18 17:43:39,223 - climada.entity.exposures.base - INFO - ref_year metadata set to default value: 2018
2019-06-18 17:43:39,224 - climada.entity.exposures.base - INFO - value_unit metadata set to default value: USD
2019-06-18 17:43:39,225 - climada.entity.exposures.base - INFO - meta metadata set to default value: None
2019-06-18 17:43:39,227 - climada.entity.exposures.base - INFO - centr_ not set.
2019-06-18 17:43:39,228 - climada.entity.exposures.base - INFO - category_id not set.
2019-06-18 17:43:39,229 - climada.entity.exposures.base - INFO - region_id not set.
2019-06-18 17:43:39,231 - climada.entity.exposures.base - INFO - geometry not set.
2019-06-18 17:43:39,359 - climada.hazard.base - INFO - Reading /Users/aznarsig/Documents/Python/climada_python/data/demo/WS_ERA40.mat
2019-06-18 17:43:39,594 - climada.hazard.centroids.centr - INFO - Reading /Users/aznarsig/Documents/Python/climada_python/data/demo/WS_ERA40.mat
2019-06-18 17:43:39,898 - climada.entity.exposures.base - INFO - Matching 6186 exposures with 6331 centroids.
2019-06-18 17:43:40,618 - climada.engine.impact - INFO - Calculating damage for 6186 assets (>0) and 1755 events.
/Users/aznarsig/anaconda3/envs/climada_up/lib/python3.7/site-packages/matplotlib/tight_layout.py:176: UserWarning: Tight layout not applied. The left and right margins cannot be made large enough to accommodate all axes decorations.
  warnings.warn('Tight layout not applied. The left and right margins '
[13]:
(<Figure size 288x288 with 1 Axes>,
 [<matplotlib.axes._subplots.AxesSubplot at 0x1c2da76b70>])
../_images/tutorial_1_main_climada_35_3.png
../_images/tutorial_1_main_climada_35_4.png
../_images/tutorial_1_main_climada_35_5.png
../_images/tutorial_1_main_climada_35_6.png