Pymagicc Demo

This small demo of Pymagicc (see https://github.com/openclimatedata/pymagicc) is built using a Jupyter Notebook and Appmode. Thanks to the Binder project it can be found online at:

https://mybinder.org/v2/gh/openclimatedata/pymagicc/master?urlpath=apps%2Fnotebooks%2FDemo.ipynb

It shows output from Pymagicc for the four Representative Concentration Pathways (RCPs). One of the many model parameters, the climate sensitivity, can be adjusted. To see how the demo is made or change it, click on "Edit App" above.


In [1]:
%matplotlib inline
import matplotlib.pyplot as plt
import pymagicc

from ipywidgets import widgets
from IPython.display import Javascript

from functools import lru_cache

plt.style.use("ggplot")



In [2]:
@lru_cache(maxsize=32)
def run_pymagicc(scenario, core_climatesensitivity=3):
    return pymagicc.run(
        pymagicc.scenarios[scenario], 
        core_climatesensitivity=core_climatesensitivity
    )

In [12]:
# NBVAL_IGNORE_OUTPUT
# Reference period
start = 1850
end = 1900

widget_scenario = widgets.Dropdown(
    title="Emissions Scenario", 
    value="RCP26",
    options=["RCP26", "RCP45", "RCP60", "RCP85"]
)

widget_status = widgets.HTML()

gases = pymagicc.rcp26.variables().values

widget_gas_1 = widgets.Dropdown(
    title="Emissions from", 
    value="Emissions|CO2|MAGICC Fossil and Industrial",
    options=gases
)
widget_gas_2 = widgets.Dropdown(
    title="Emissions from", 
    value="Emissions|CO2|MAGICC AFOLU",
    options=gases
)
widget_gas_3 = widgets.Dropdown(
    title="Emissions from", 
    value="Emissions|CH4",
    options=gases
)
widget_gas_4 = widgets.Dropdown(
    title="Emissions from", 
    value="Emissions|N2O",
    options=gases
)

style = {'description_width': 'initial'}
widget_core_climatesensitivity = widgets.FloatSlider(
    value=3, min=1.5, max=4.5, step=0.1, continuous_update=False,
    description="Climate Sensitivity",
    style=style
)

scen = pymagicc.scenarios["RCP26"]
data = scen.filter(
    region="World",
    variable="Emissions|CO2|MAGICC Fossil and Industrial",
    year=range(1, 2101)
)

widget_output = widgets.Output()

ui = widgets.VBox([
    widgets.HBox([widget_scenario,  widget_status]),
    widgets.HBox([widget_gas_1, widget_gas_2, widget_gas_3, widget_gas_4]),
    widget_core_climatesensitivity,
    widget_output])

def update(scenario, gas_1, gas_2, gas_3, gas_4, core_climatesensitivity):
    widget_status.value = "<em>Processing</em> …"
    scen = pymagicc.scenarios[scenario]
    data = scen.filter(
        region="World",
        year=range(1, 2101),
    )

    results = run_pymagicc(
        scenario, 
        core_climatesensitivity=core_climatesensitivity
    )
    
    fig, axes = plt.subplots(2, 4, figsize=(24, 15))
    for i, gas in enumerate([gas_1, gas_2, gas_3, gas_4]):
        gas_data = data.filter(variable=gas)
        unit = gas_data["unit"].iloc[0]
        gas_data.line_plot(x="time", ax=axes[0, i], legend=False)
        axes[0, i].set_title("{} [{}]".format(gas, unit))
    
    temp = results.filter(
        variable="Surface Temperature",
        region="World",
    )
    temp.data.loc[:, "value"] -= temp.filter(year=range(start, end+1))["value"].mean()
    temp.line_plot(ax=axes[1, 0], x="time", legend=False)
    axes[1, 0].set_title("Surface Temperature [°C]")
    
    results.filter(
        variable="Atmospheric Concentrations|CO2",
        region="World",
    ).line_plot(x="time", ax=axes[1, 1], legend=False)
    axes[1, 1].set_title("CO$_2$ Concentration [ppm]")
    
    results.filter(
        variable="Radiative Forcing|Greenhouse Gases",
        region="World",
    ).line_plot(x="time", ax=axes[1, 2], legend=False)
    axes[1, 2].set_title("Radiative Forcing [W/m$^2$]")
    
    axes[1, 3].remove()
    widget_status.value = ""

out = widgets.interactive_output(
    update, 
    {
        "scenario": widget_scenario, 
        "gas_1": widget_gas_1,
        "gas_2": widget_gas_2,
        "gas_3": widget_gas_3,
        "gas_4": widget_gas_4,
        "core_climatesensitivity": widget_core_climatesensitivity
    }
)
    
display(ui, out)


Surface temperature is relative to the pre-industrial 1850-1900 period.