Open In Colab   Open in Kaggle

Tutorial 3: Reconstructing Past Changes in Terrestrial Climate#

Week 1, Day 4, Paleoclimate

Content creators: Sloane Garelick

Content reviewers: Yosmely Bermúdez, Dionessa Biton, Katrina Dobson, Maria Gonzalez, Will Gregory, Nahid Hasan, Sherry Mi, Beatriz Cosenza Muralles, Brodie Pearson, Jenna Pearson, Chi Zhang, Ohad Zivan

Content editors: Yosmely Bermúdez, Zahra Khodakaramimaghsoud, Jenna Pearson, Agustina Pesce, Chi Zhang, Ohad Zivan

Production editors: Wesley Banfield, Jenna Pearson, Chi Zhang, Ohad Zivan

Our 2023 Sponsors: NASA TOPS and Google DeepMind

Tutorial Objectives#

In this tutorial, we’ll explore the Euro2K proxy network, which is a subset of PAGES2K, the database we explored in the first tutorial. We will specifically focus on interpreting temperature change over the past 2,000 years as recorded by proxy records from tree rings, speleothems, and lake sediments. To analyze these datasets, we will group them by archive and create time series plots to assess temperature variations.

During this tutorial you will:

  • Plot temperature records based on three different terrestrial proxies

  • Assess similarities and differences between the temperature records

Setup#

# installations ( uncomment and run this cell ONLY when using google colab or kaggle )

# !pip install LiPD
# !pip install cartopy
# !pip install pyleoclim
# imports
import pyleoclim as pyleo
import pandas as pd
import numpy as np
import os
import pooch
import tempfile
import matplotlib.pyplot as plt
import cartopy
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from io import StringIO
import sys

Helper functions#

Hide code cell source
# @title Helper functions


def pooch_load(filelocation=None, filename=None, processor=None):
    # this is different for each day
    shared_location = "/home/jovyan/shared/Data/tutorials/W1D4_Paleoclimate"
    user_temp_cache = tempfile.gettempdir()

    if os.path.exists(os.path.join(shared_location, filename)):
        file = os.path.join(shared_location, filename)
    else:
        file = pooch.retrieve(
            filelocation,
            known_hash=None,
            fname=os.path.join(user_temp_cache, filename),
            processor=processor,
        )

    return file


class SupressOutputs(list):
    def __enter__(self):
        self._stdout = sys.stdout
        sys.stdout = self._stringio = StringIO()
        return self

    def __exit__(self, *args):
        self.extend(self._stringio.getvalue().splitlines())
        del self._stringio  # free up some memory
        sys.stdout = self._stdout

Video 1: Terrestrial Climate Proxies#

Section 1: Loading Terrestrial Paleoclimate Records#

First, we need to download the data. Similar to Tutorial 1, the data is stored as a LiPD file, and we will be using Pyleoclim to format and interpret the data.

# set the name to save the Euro2k data
fname = "euro2k_data"

# download the data
lipd_file_path = pooch.retrieve(
    url="https://osf.io/7ezp3/download/",
    known_hash=None,
    path="./",
    fname=fname,
    processor=pooch.Unzip(),
)
# the LiPD object can be used to load datasets stored in the LiPD format.
# in this first case study, we will load an entire library of LiPD files:
with SupressOutputs():
    d_euro = pyleo.Lipd(os.path.join(".", f"{fname}.unzip", "Euro2k"))
/tmp/ipykernel_109731/2313300970.py:4: DeprecationWarning: The Lipd class is being deprecated and will be removed in Pyleoclim v1.0.0. Functionalities will instead be handled by the pyLipd package.
  d_euro = pyleo.Lipd(os.path.join(".", f"{fname}.unzip", "Euro2k"))

Section 2: Temperature Reconstructions#

Before plotting, let’s narrow the data down a bit. We can filter all of the data so that we only keep reconstructions of temperature from terrestrial archives (e.g. tree rings, speleothems and lake sediments). This is accomplished with the function below.

def filter_data(dataset, archive_type, variable_name):
    """
    Return a MultipleSeries object with the variable record (variable_name) for a given archive_type and coordinates.
    """
    # Create a list of dictionary that can be iterated upon using Lipd.to_tso method
    ts_list = dataset.to_tso()
    # Append the correct indices for a given value of archive_type and variable_name
    indices = []
    lat = []
    lon = []
    for idx, item in enumerate(ts_list):
        # Check that it is available to avoid errors on the loop
        if "archiveType" in item.keys():
            # If it's a archive_type, then proceed to the next step
            if item["archiveType"] == archive_type:
                if item["paleoData_variableName"] == variable_name:
                    indices.append(idx)
    print(indices)
    # Create a list of LipdSeries for the given indices
    ts_list_archive_type = []
    for indice in indices:
        ts_list_archive_type.append(pyleo.LipdSeries(ts_list[indice]))

        # save lat and lons of proxies
        lat.append(ts_list[indice]["geo_meanLat"])
        lon.append(ts_list[indice]["geo_meanLon"])

    return pyleo.MultipleSeries(ts_list_archive_type), lat, lon

In the function above, the Lipd.to_tso method is used to obtain a list of dictionaries that can be iterated upon.

ts_list = d_euro.to_tso()
extracting paleoData...
extracting: Arc-PolarUrals.Wilson.2015
extracting: Eur-NorthernScandinavia.Esper.2012
extracting: Eur-CentralandEasternPyrenees.Pla.2004
extracting: Eur-LakeSilvaplana.Trachsel.2010
extracting: Eur-CoastofPortugal.Abrantes.2011
extracting: Eur-SpannagelCave.Mangini.2005
extracting: Ocn-AqabaJordanAQ18.Heiss.1999
extracting: Ocn-RedSea.Felis.2000
extracting: Arc-Kittelfjall.Bjorklund.2012
extracting: Ocn-AqabaJordanAQ19.Heiss.1999
extracting: Eur-Stockholm.Leijonhufvud.2009
extracting: Eur-NorthernSpain.Martín-Chivelet.2011
extracting: Eur-RAPiD-17-5P.Moffa-Sanchez.2014
extracting: Eur-MaritimeFrenchAlps.Büntgen.2012
extracting: Arc-GulfofAlaska.Wilson.2014
extracting: Eur-Lötschental.Büntgen.2006
extracting: Eur-EuropeanAlps.Büntgen.2011
extracting: Arc-Jamtland.Wilson.2016
extracting: Arc-Forfjorddalen.McCarroll.2013
extracting: Eur-EasternCarpathianMountains.Popa.2008
extracting: Eur-LakeSilvaplana.Larocque-Tobler.2010
extracting: Eur-SpanishPyrenees.Dorado-Linan.2012
extracting: Eur-Tallinn.Tarand.2001
extracting: Eur-FinnishLakelands.Helama.2014
extracting: Eur-Seebergsee.Larocque-Tobler.2012
extracting: Arc-Tornetrask.Melvin.2012
extracting: Arc-Tjeggelvas.Bjorklund.2012
extracting: Arc-AkademiiNaukIceCap.Opel.2013
extracting: Eur-CentralEurope.Dobrovolný.2009
extracting: Eur-TatraMountains.Büntgen.2013
extracting: Arc-Indigirka.Hughes.1999
Created time series: 73 entries

Dictionaries are native to Python and can be explored as shown below.

# look at available entries for just one time-series
ts_list[0].keys()
dict_keys(['mode', 'time_id', '@context', 'archiveType', 'createdBy', 'dataContributor', 'dataSetName', 'googleDataURL', 'googleMetadataWorksheet', 'googleSpreadSheetKey', 'originalDataURL', 'studyName', 'tagMD5', 'pub1_author', 'pub1_abstract', 'pub1_citeKey', 'pub1_dataUrl', 'pub1_issue', 'pub1_journal', 'pub1_pages', 'pub1_publisher', 'pub1_title', 'pub1_type', 'pub1_volume', 'pub1_year', 'pub1_doi', 'pub2_author', 'pub2_Urldate', 'pub2_citeKey', 'pub2_institution', 'pub2_title', 'pub2_type', 'pub2_url', 'geo_type', 'geo_meanLon', 'geo_meanLat', 'geo_meanElev', 'geo_pages2kRegion', 'geo_siteName', 'lipdVersion', 'tableType', 'paleoData_paleoDataTableName', 'paleoData_googleWorkSheetKey', 'paleoData_measurementTableName', 'paleoData_measurementTableMD5', 'paleoData_filename', 'paleoData_tableName', 'paleoData_missingValue', 'year', 'yearUnits', 'paleoData_QCCertification', 'paleoData_TSid', 'paleoData_WDSPaleoUrl', 'paleoData_archiveType', 'paleoData_dataType', 'paleoData_description', 'paleoData_hasMaxValue', 'paleoData_hasMeanValue', 'paleoData_hasMedianValue', 'paleoData_hasMinValue', 'paleoData_measurementMaterial', 'paleoData_notes', 'paleoData_pages2kID', 'paleoData_paleoMeasurementTableMD5', 'paleoData_precededBy', 'paleoData_proxy', 'paleoData_proxyObservationType', 'paleoData_units', 'paleoData_useInGlobalTemperatureAnalysis', 'paleoData_variableName', 'paleoData_variableType', 'paleoData_hasResolution_hasMinValue', 'paleoData_hasResolution_hasMaxValue', 'paleoData_hasResolution_hasMeanValue', 'paleoData_hasResolution_hasMedianValue', 'paleoData_interpretation', 'paleoData_number', 'paleoData_values'])
# print relevant information for all entries
for idx, item in enumerate(ts_list):
    print(str(idx) + ": " + item["dataSetName"] +
          ": " + item["paleoData_variableName"])
0: Arc-PolarUrals.Wilson.2015: density
1: Arc-PolarUrals.Wilson.2015: year
2: Eur-NorthernScandinavia.Esper.2012: MXD
3: Eur-NorthernScandinavia.Esper.2012: year
4: Eur-CentralandEasternPyrenees.Pla.2004: sampleID
5: Eur-CentralandEasternPyrenees.Pla.2004: year
6: Eur-CentralandEasternPyrenees.Pla.2004: age
7: Eur-CentralandEasternPyrenees.Pla.2004: temperature
8: Eur-CentralandEasternPyrenees.Pla.2004: uncertainty_temperature
9: Eur-LakeSilvaplana.Trachsel.2010: temperature
10: Eur-LakeSilvaplana.Trachsel.2010: year
11: Eur-CoastofPortugal.Abrantes.2011: temperature
12: Eur-CoastofPortugal.Abrantes.2011: year
13: Eur-SpannagelCave.Mangini.2005: d18O
14: Eur-SpannagelCave.Mangini.2005: year
15: Ocn-AqabaJordanAQ18.Heiss.1999: d18O
16: Ocn-AqabaJordanAQ18.Heiss.1999: year
17: Ocn-AqabaJordanAQ18.Heiss.1999: d13C
18: Ocn-RedSea.Felis.2000: d18O
19: Ocn-RedSea.Felis.2000: year
20: Arc-Kittelfjall.Bjorklund.2012: density
21: Arc-Kittelfjall.Bjorklund.2012: year
22: Ocn-AqabaJordanAQ19.Heiss.1999: d18O
23: Ocn-AqabaJordanAQ19.Heiss.1999: year
24: Ocn-AqabaJordanAQ19.Heiss.1999: d13C
25: Eur-Stockholm.Leijonhufvud.2009: temperature
26: Eur-Stockholm.Leijonhufvud.2009: year
27: Eur-NorthernSpain.Martín-Chivelet.2011: d18O
28: Eur-NorthernSpain.Martín-Chivelet.2011: year
29: Eur-RAPiD-17-5P.Moffa-Sanchez.2014: d18O
30: Eur-RAPiD-17-5P.Moffa-Sanchez.2014: year
31: Eur-MaritimeFrenchAlps.Büntgen.2012: trsgi
32: Eur-MaritimeFrenchAlps.Büntgen.2012: year
33: Arc-GulfofAlaska.Wilson.2014: temperature
34: Arc-GulfofAlaska.Wilson.2014: year
35: Eur-Lötschental.Büntgen.2006: MXD
36: Eur-Lötschental.Büntgen.2006: year
37: Eur-EuropeanAlps.Büntgen.2011: trsgi
38: Eur-EuropeanAlps.Büntgen.2011: year
39: Arc-Jamtland.Wilson.2016: MXD
40: Arc-Jamtland.Wilson.2016: year
41: Arc-Forfjorddalen.McCarroll.2013: MXD
42: Arc-Forfjorddalen.McCarroll.2013: year
43: Eur-EasternCarpathianMountains.Popa.2008: trsgi
44: Eur-EasternCarpathianMountains.Popa.2008: year
45: Eur-LakeSilvaplana.Larocque-Tobler.2010: temperature
46: Eur-LakeSilvaplana.Larocque-Tobler.2010: year
47: Eur-SpanishPyrenees.Dorado-Linan.2012: trsgi
48: Eur-SpanishPyrenees.Dorado-Linan.2012: year
49: Eur-Tallinn.Tarand.2001: temperature
50: Eur-Tallinn.Tarand.2001: year
51: Eur-Tallinn.Tarand.2001: JulianDay
52: Eur-FinnishLakelands.Helama.2014: temperature
53: Eur-FinnishLakelands.Helama.2014: year
54: Eur-Seebergsee.Larocque-Tobler.2012: temperature
55: Eur-Seebergsee.Larocque-Tobler.2012: year
56: Arc-Tornetrask.Melvin.2012: temperature
57: Arc-Tornetrask.Melvin.2012: year
58: Arc-Tornetrask.Melvin.2012: temperature
59: Arc-Tornetrask.Melvin.2012: sampleDensity
60: Arc-Tjeggelvas.Bjorklund.2012: density
61: Arc-Tjeggelvas.Bjorklund.2012: year
62: Arc-AkademiiNaukIceCap.Opel.2013: thickness
63: Arc-AkademiiNaukIceCap.Opel.2013: year
64: Arc-AkademiiNaukIceCap.Opel.2013: age
65: Arc-AkademiiNaukIceCap.Opel.2013: d18O
66: Arc-AkademiiNaukIceCap.Opel.2013: Na
67: Eur-CentralEurope.Dobrovolný.2009: temperature
68: Eur-CentralEurope.Dobrovolný.2009: year
69: Eur-TatraMountains.Büntgen.2013: trsgi
70: Eur-TatraMountains.Büntgen.2013: year
71: Arc-Indigirka.Hughes.1999: trsgi
72: Arc-Indigirka.Hughes.1999: year

Now let’s use our pre-defined function to create a new list that only has temperature reconstructions based on proxies from lake sediments:

ms_euro_lake, euro_lake_lat, euro_lake_lon = filter_data(
    d_euro, "lake sediment", "temperature"
)
extracting paleoData...
extracting: Arc-PolarUrals.Wilson.2015
extracting: Eur-NorthernScandinavia.Esper.2012
extracting: Eur-CentralandEasternPyrenees.Pla.2004
extracting: Eur-LakeSilvaplana.Trachsel.2010
extracting: Eur-CoastofPortugal.Abrantes.2011
extracting: Eur-SpannagelCave.Mangini.2005
extracting: Ocn-AqabaJordanAQ18.Heiss.1999
extracting: Ocn-RedSea.Felis.2000
extracting: Arc-Kittelfjall.Bjorklund.2012
extracting: Ocn-AqabaJordanAQ19.Heiss.1999
extracting: Eur-Stockholm.Leijonhufvud.2009
extracting: Eur-NorthernSpain.Martín-Chivelet.2011
extracting: Eur-RAPiD-17-5P.Moffa-Sanchez.2014
extracting: Eur-MaritimeFrenchAlps.Büntgen.2012
extracting: Arc-GulfofAlaska.Wilson.2014
extracting: Eur-Lötschental.Büntgen.2006
extracting: Eur-EuropeanAlps.Büntgen.2011
extracting: Arc-Jamtland.Wilson.2016
extracting: Arc-Forfjorddalen.McCarroll.2013
extracting: Eur-EasternCarpathianMountains.Popa.2008
extracting: Eur-LakeSilvaplana.Larocque-Tobler.2010
extracting: Eur-SpanishPyrenees.Dorado-Linan.2012
extracting: Eur-Tallinn.Tarand.2001
extracting: Eur-FinnishLakelands.Helama.2014
extracting: Eur-Seebergsee.Larocque-Tobler.2012
extracting: Arc-Tornetrask.Melvin.2012
extracting: Arc-Tjeggelvas.Bjorklund.2012
extracting: Arc-AkademiiNaukIceCap.Opel.2013
extracting: Eur-CentralEurope.Dobrovolný.2009
extracting: Eur-TatraMountains.Büntgen.2013
extracting: Arc-Indigirka.Hughes.1999
Created time series: 73 entries
[7, 9, 45, 54]
Both age and year information are available, using age
/tmp/ipykernel_109731/2522667653.py:22: DeprecationWarning: The LipdSeries class is being deprecated and will be removed in Pyleoclim v1.0.0. It will be replaced by the geoSeries class (currently in development).
  ts_list_archive_type.append(pyleo.LipdSeries(ts_list[indice]))

And a new list that only has temperature reconstructions based on proxies from tree rings:

ms_euro_tree, euro_tree_lat, euro_tree_lon = filter_data(
    d_euro, "tree", "temperature")
extracting paleoData...
extracting: Arc-PolarUrals.Wilson.2015
extracting: Eur-NorthernScandinavia.Esper.2012
extracting: Eur-CentralandEasternPyrenees.Pla.2004
extracting: Eur-LakeSilvaplana.Trachsel.2010
extracting: Eur-CoastofPortugal.Abrantes.2011
extracting: Eur-SpannagelCave.Mangini.2005
extracting: Ocn-AqabaJordanAQ18.Heiss.1999
extracting: Ocn-RedSea.Felis.2000
extracting: Arc-Kittelfjall.Bjorklund.2012
extracting: Ocn-AqabaJordanAQ19.Heiss.1999
extracting: Eur-Stockholm.Leijonhufvud.2009
extracting: Eur-NorthernSpain.Martín-Chivelet.2011
extracting: Eur-RAPiD-17-5P.Moffa-Sanchez.2014
extracting: Eur-MaritimeFrenchAlps.Büntgen.2012
extracting: Arc-GulfofAlaska.Wilson.2014
extracting: Eur-Lötschental.Büntgen.2006
extracting: Eur-EuropeanAlps.Büntgen.2011
extracting: Arc-Jamtland.Wilson.2016
extracting: Arc-Forfjorddalen.McCarroll.2013
extracting: Eur-EasternCarpathianMountains.Popa.2008
extracting: Eur-LakeSilvaplana.Larocque-Tobler.2010
extracting: Eur-SpanishPyrenees.Dorado-Linan.2012
extracting: Eur-Tallinn.Tarand.2001
extracting: Eur-FinnishLakelands.Helama.2014
extracting: Eur-Seebergsee.Larocque-Tobler.2012
extracting: Arc-Tornetrask.Melvin.2012
extracting: Arc-Tjeggelvas.Bjorklund.2012
extracting: Arc-AkademiiNaukIceCap.Opel.2013
extracting: Eur-CentralEurope.Dobrovolný.2009
extracting: Eur-TatraMountains.Büntgen.2013
extracting: Arc-Indigirka.Hughes.1999
Created time series: 73 entries
[33, 52, 56, 58]
/tmp/ipykernel_109731/2522667653.py:22: DeprecationWarning: The LipdSeries class is being deprecated and will be removed in Pyleoclim v1.0.0. It will be replaced by the geoSeries class (currently in development).
  ts_list_archive_type.append(pyleo.LipdSeries(ts_list[indice]))

And finally, a new list that only has temperature information based on proxies from speleothems:

ms_euro_spel, euro_spel_lat, euro_spel_lon = filter_data(
    d_euro, "speleothem", "d18O")
extracting paleoData...
extracting: Arc-PolarUrals.Wilson.2015
extracting: Eur-NorthernScandinavia.Esper.2012
extracting: Eur-CentralandEasternPyrenees.Pla.2004
extracting: Eur-LakeSilvaplana.Trachsel.2010
extracting: Eur-CoastofPortugal.Abrantes.2011
extracting: Eur-SpannagelCave.Mangini.2005
extracting: Ocn-AqabaJordanAQ18.Heiss.1999
extracting: Ocn-RedSea.Felis.2000
extracting: Arc-Kittelfjall.Bjorklund.2012
extracting: Ocn-AqabaJordanAQ19.Heiss.1999
extracting: Eur-Stockholm.Leijonhufvud.2009
extracting: Eur-NorthernSpain.Martín-Chivelet.2011
extracting: Eur-RAPiD-17-5P.Moffa-Sanchez.2014
extracting: Eur-MaritimeFrenchAlps.Büntgen.2012
extracting: Arc-GulfofAlaska.Wilson.2014
extracting: Eur-Lötschental.Büntgen.2006
extracting: Eur-EuropeanAlps.Büntgen.2011
extracting: Arc-Jamtland.Wilson.2016
extracting: Arc-Forfjorddalen.McCarroll.2013
extracting: Eur-EasternCarpathianMountains.Popa.2008
extracting: Eur-LakeSilvaplana.Larocque-Tobler.2010
extracting: Eur-SpanishPyrenees.Dorado-Linan.2012
extracting: Eur-Tallinn.Tarand.2001
extracting: Eur-FinnishLakelands.Helama.2014
extracting: Eur-Seebergsee.Larocque-Tobler.2012
extracting: Arc-Tornetrask.Melvin.2012
extracting: Arc-Tjeggelvas.Bjorklund.2012
extracting: Arc-AkademiiNaukIceCap.Opel.2013
extracting: Eur-CentralEurope.Dobrovolný.2009
extracting: Eur-TatraMountains.Büntgen.2013
extracting: Arc-Indigirka.Hughes.1999
Created time series: 73 entries
[13, 27]
/tmp/ipykernel_109731/2522667653.py:22: DeprecationWarning: The LipdSeries class is being deprecated and will be removed in Pyleoclim v1.0.0. It will be replaced by the geoSeries class (currently in development).
  ts_list_archive_type.append(pyleo.LipdSeries(ts_list[indice]))

Coding Exercises 2#

Using the coordinate information output from the filter_data() function, make a plot of the locations of the proxies using the markers and colors from Tutorial 1. Note that data close together may not be very visible.

# initate plot with the specific figure size
fig = plt.figure(figsize=(9, 6))

# set base map projection
ax = plt.axes(projection=ccrs.Robinson())

ax.set_global()

# add land fratures using gray color
ax.add_feature(cfeature.LAND, facecolor="k")

# add coastlines
ax.add_feature(cfeature.COASTLINE)

# add the proxy locations
# Uncomment and complete following line
# _ = ax.scatter(
#     ...,
#     ...,
#     transform=ccrs.Geodetic(),
#     label=...,
#     s=50,
#     marker="d",
#     color=[0.52734375, 0.8046875, 0.97916667],
#     edgecolor="k",
#     zorder=2,
# )
# _ = ax.scatter(
#     ...,
#     ...,
#     transform=ccrs.Geodetic(),
#     label=...,
#     s=50,
#     marker="p",
#     color=[0.73828125, 0.71484375, 0.41796875],
#     edgecolor="k",
#     zorder=2,
# )
# _ = ax.scatter(
#     ...,
#     ...,
#     transform=ccrs.Geodetic(),
#     label=...,
#     s=50,
#     marker="8",
#     color=[1, 0, 0],
#     edgecolor="k",
#     zorder=2,
# )

# change the map view to zoom in on central Pacific
ax.set_extent((0, 360, 0, 90), crs=ccrs.PlateCarree())

ax.legend(
    scatterpoints=1,
    bbox_to_anchor=(0, -0.4),
    loc="lower left",
    ncol=3,
    fontsize=15,
)
<matplotlib.legend.Legend at 0x7f1915a36880>
../../../_images/fa7dc67f1222fd1334b112a0d95e860b551570179d5a9b36272e9a04cbf32c48.png

Click for solution

Example output:

Solution hint

Since we are going to compare temperature datasets based on different terrestrial climate archives (lake sediments, tree rings and speleothems), the quantitative values of the measurements in each record will differ (i.e., the lake sediment and tree ring data are temperature in degrees C, but the speleothem data is oxygen isotopes in per mille). Therefore, to more easily and accurately compare temperature between the records, it’s helpful to standardize the data as we did in tutorial 2. The .standardize() function removes the estimated mean of the time series and divides by its estimated standard deviation.

# standardize the data
spel_stnd = ms_euro_spel.standardize()
lake_stnd = ms_euro_lake.standardize()
tree_stnd = ms_euro_tree.standardize()

Now we can use Pyleoclim functions to create three stacked plots of this data with lake sediment records on top, tree ring reconstructions in the middle and speleothem records on the bottom.

Note that the colors used for the time series in each plot are the default colors generated by the function, so the corresponding colors in each of the three plots are not relevant.

# note the x axis is years before present, so read from left to right moving back in time

ax = lake_stnd.stackplot(
    label_x_loc=1.7,
    xlim=[0, 2000],
    v_shift_factor=1,
    figsize=[9, 5],
    time_unit="yrs BP",
)
ax[0].suptitle("Lake Cores", y=1.2)

ax = tree_stnd.stackplot(
    label_x_loc=1.7,
    xlim=[0, 2000],
    v_shift_factor=1,
    figsize=[9, 5],
    time_unit="yrs BP",
)
ax[0].suptitle("Tree Rings", y=1.2)

# recall d18O is a proxy for SST, and that more positive d18O means colder SST
ax = spel_stnd.stackplot(
    label_x_loc=1.7,
    xlim=[0, 2000],
    v_shift_factor=1,
    figsize=[9, 5],
    time_unit="yrs BP",
)
ax[0].suptitle("Speleothems", y=1.2)
Text(0.5, 1.2, 'Speleothems')
../../../_images/395579eab177ddaeb80dd59ed4e26b090e12757de7cff937d1bbc6ce9b4a3764.png ../../../_images/f29d10bcda6cf5fad14632530b49b27b34e3484979aeb24042bed9ef52057fb3.png ../../../_images/223159e1b3ac72777748a2c58a7b90c32bdef0917185cddbb84147bad970b04c.png

Questions 2#

Using the plots we just made (and recalling that all of these records are from Europe), let’s make some inferences about the temperature data over the past 2,000 years:

  1. Recall that δ18O is a proxy for SST, and that more positive δ18O means colder SST. Do the temperature records based on a single proxy type record similar patterns?

  2. Do the three proxy types collectively record similar patterns?

  3. What might be causing the more frequent variations in temperature?

Click for solution

Summary#

In this tutorial, we explored how to use the Euro2k proxy network to investigate changes in temperature over the past 2,000 years from tree rings, speleothems, and lake sediments. To analyze these diverse datasets, we categorized them based on their archive type and constructed time series plots.

Resources#

Code for this tutorial is based on an existing notebook from LinkedEarth that provides instruction on working with LiPD files.

Data from the following sources are used in this tutorial:

  • Euro2k database: PAGES2k Consortium., Emile-Geay, J., McKay, N. et al. A global multiproxy database for temperature reconstructions of the Common Era. Sci Data 4, 170088 (2017). https://doi.org/10.1038/sdata.2017.88