Global characteristics of short-lived non-CO2 emissions (Figure 2.7)

Notebook sr15_2.3.3_short-lived_climate_forcers

This notebook is based on the Release 1.1 of the IAMC 1.5C Scenario Explorer and Data and refers to the published version of the IPCC Special Report on Global Warming of 1.5C (SR15).

The notebook is run with pyam release 0.5.0.

The source code of this notebook is available on GitHub (release 2.0.2).


IPCC SR15 scenario assessment

Analysis of short-lived non-CO2 emissions

This notebook plots emissions of CH4, F-gases, BC and SO2 as shown in Figure 2.7 of the IPCC's "Special Report on Global Warming of 1.5°C".

The scenario data used in this analysis can be accessed and downloaded at

Load pyam package and other dependencies

In [1]:
import pandas as pd
import numpy as np
import io
import itertools
import yaml
import math
import matplotlib.pyplot as plt'style_sr15.mplstyle')
%matplotlib inline
import pyam

from utils import boxplot_by_cat
pyam - INFO: Running in a notebook, setting `pyam` logging level to `logging.INFO` and adding stderr handler

Import scenario data, categorization and specifications files

The metadata file with scenario categorisation and quantitative indicators can be downloaded at
Alternatively, it can be re-created using the notebook sr15_2.0_categories_indicators.

The last cell of this section loads and assigns a number of auxiliary lists as defined in the categorization notebook.

In [2]:
sr1p5 = pyam.IamDataFrame(data='../data/iamc15_scenario_data_world_r2.0.xlsx')
pyam.utils - INFO: Reading `../data/iamc15_scenario_data_world_r2.0.xlsx`
In [3]:
pyam.core - INFO: Importing metadata for 416 scenarios (for total of 416)
In [4]:
with open("sr15_specs.yaml", 'r') as stream:
    specs = yaml.load(stream, Loader=yaml.FullLoader)

rc = pyam.run_control()
for item in specs.pop('run_control').items():
    rc.update({item[0]: item[1]})
cats = specs.pop('cats')
all_cats = specs.pop('all_cats')
subcats = specs.pop('subcats')
all_subcats = specs.pop('all_subcats')
plotting_args = specs.pop('plotting_args')
marker= specs.pop('marker')

Downselect scenario ensemble to categories of interest for this assessment

In [5]:
years = [2010, 2030, 2050]
In [6]:
cats.remove('Above 2C')
In [7]:
sr1p5.meta.rename(columns={'Kyoto-GHG|2010 (SAR)': 'kyoto_ghg_2010'}, inplace=True)
In [8]:
df = sr1p5.filter(kyoto_ghg_2010='in range', category=cats, year=years)

Set specifications for filter and plotting

In [9]:
save_name = 'output/fig2.7{}.{}'
In [10]:
filter_args = dict(df=sr1p5, category=cats, marker=None, join_meta=True)
In [11]:
compare_years = [2030, 2050]
base_year = 2010
In [12]:
def plotting_args(name, filetype='png'):
    return {'categories': cats, 'column': 'category', 'years': years,
            'add_marker': marker,
            'save': save_name.format(name, filetype)}
In [13]:
data = []

Plot different emissions pathways by category

In [14]:
ch4 = df.filter(variable='Emissions|CH4').timeseries()
In [15]:
name = 'ch4'
label = 'Global CH4 emissions'
unit = 'MtCH4/yr'
_data = pyam.filter_by_meta(ch4, **filter_args)
fig = boxplot_by_cat(_data, ylabel='{} ({})'.format(label, unit),
_data['species'] = name
In [16]:
fgases = df.filter(variable='Emissions|F-Gases').timeseries()
In [17]:
name = 'f-gases'
label = 'Global F-gas emissions'
unit = 'GtCO2e/yr'

_data = pyam.filter_by_meta(fgases, **filter_args)
fig = boxplot_by_cat(_data, ylabel='{} ({})'.format(label, unit),
                     **plotting_args('b_{}'.format(name)), legend=False)
_data['species'] = name
In [18]:
bc = df.filter(variable='Emissions|BC').timeseries()
In [19]:
name = 'bc'
label = 'Global BC emissions'
unit = 'MtBC'

_data = pyam.filter_by_meta(bc, **filter_args)
fig = boxplot_by_cat(_data, ylabel='{} ({})'.format(label, unit),
                     **plotting_args('c_{}'.format(name)), legend=False)
_data['species'] = name
In [20]:
so2 = df.filter(variable='Emissions|Sulfur').timeseries()
In [21]:
name = 'so2'
label = 'Global SO2 emissions'
unit = 'MtSO2'
_data = pyam.filter_by_meta(so2, **filter_args)
fig = boxplot_by_cat(_data, ylabel='{} ({})'.format(label, unit),
                     **plotting_args('d_{}'.format(name)), legend=False)
_data['species'] = name

Export timeseries data to xlsx

In [22]:
data = pd.concat(data).set_index(['species', 'category', 'marker'], append=True)
In [23]:
2010 2030 2050
model scenario region variable unit species category marker
IMAGE 3.0.1 IMA15-RenElec World Emissions|CH4 Mt CH4/yr ch4 1.5C high overshoot NaN 349.608185 243.733200 190.165695
REMIND 1.7 ADVANCE_2020_Med2C World Emissions|CH4 Mt CH4/yr ch4 Higher 2C NaN 371.620600 348.322900 264.427200
AIM/CGE 2.0 SFCM_SSP2_SupTech_1p5Degree World Emissions|CH4 Mt CH4/yr ch4 Lower 2C NaN 372.161500 199.236700 144.036800
MESSAGE-GLOBIOM 1.0 EMF33_Med2C_cost100 World Emissions|CH4 Mt CH4/yr ch4 Higher 2C NaN 326.445555 282.830349 234.067868
ADVANCE_2020_1.5C-2100 World Emissions|CH4 Mt CH4/yr ch4 1.5C low overshoot NaN 325.287412 238.415911 169.963534
In [24]:
In [ ]: