Group project: the Climate System¶
Instructions¶
Objectives
In this final project, you will apply the methods you learned over the past weeks to answer the questions below.
Deadline
Please submit your project via OLAT before Thursday January 09 at 00H (in the night from Wednesday to Thursday).
Formal requirements
You will work in groups of two. If we are an odd number of students, one group can have three participants. (Tip: We recommend that students who have not followed a programming class to team up with students who have).
Each group will submit one (executed) jupyter notebook containing the code, plots, and answers to the questions (text in the markdown format). Please also submit an HTML version of the notebook. Please ensure that your HTML file is smaller than 10 MB. This helps us provide you with more detailed and readable feedback.
Each group member must contribute to the notebook. The notebook should be self-contained and the answers must be well structured. The plots must be as understandable as possible (title, units, x and y axis labels, appropriate colors and levels…).
Please be concise in your answer. We expect a few sentences per answer at most - there is no need to write a new text book in this project! Use links and references to the literature or your class slides where appropriate.
Grading
We will give one grade per project, according to the following table (total 10 points):
- correctness of the code and the plots: content, legends, colors, units, etc. (3 points)
- quality of the answers: correctness, preciseness, appropriate use of links and references to literature or external resources (5 points)
- originality and quality of the open research question (2 points)
# Import the tools we are going to need today:
import matplotlib.pyplot as plt # plotting library
import numpy as np # numerical library
import xarray as xr # netCDF library
import pandas as pd # tabular library
import cartopy # Map projections libary
import cartopy.crs as ccrs # Projections list
# Some defaults:
plt.rcParams['figure.figsize'] = (12, 5) # Default plot size
Part 1 - temperature climatology¶
Open the ERA5 temperature data:
ds = xr.open_dataset('../data/ERA5_LowRes_Monthly_t2m.nc')
ds
<xarray.Dataset> Size: 444MB Dimensions: (longitude: 480, latitude: 241, time: 480) Coordinates: * longitude (longitude) float32 2kB -179.6 -178.9 -178.1 ... 178.9 179.6 * latitude (latitude) float32 964B 90.0 89.25 88.5 ... -88.5 -89.25 -90.0 * time (time) datetime64[ns] 4kB 1979-01-01 1979-02-01 ... 2018-12-01 Data variables: t2m (time, latitude, longitude) float64 444MB ... Attributes: Conventions: CF-1.6 history: 2019-11-18 09:36:58 GMT by grib_to_netcdf-2.14.0: /opt/ecmw...
Plot three global maps:
- Compute and plot the temporal mean temperature ¯T for the entire period (unit °C)
- Compute and plot ¯T∗ (see lesson), the zonal anomaly map of average temperature.
- Compute and plot the monthly average temperature for each month ¯TM (annual cycle). We expect a variable of dimensions (month: 12, latitude: 241, longitude: 480). Hint: remember the
.groupby()
command we learned in the lesson. Now plot the average monthly temperature range map, i.e. max(¯TM) - min(¯TM) (maximum and minimum over the month dimension).
Questions:
- Look at the zonal temperature anomaly map.
- Explain why northern Europe and the North Atlantic region is significantly warmer than the same latitudes in North America or Russia.
- Explain why the Northern Pacific Ocean does not have a similar pattern.
- Look at the average monthly temperature range map.
- Explain why the temperature range is smaller in the tropics than at higher latitudes
- Explain why the temperature range is smaller over oceans than over land
- Where is the temperature range largest? Explain why.
### plotting the temperal average temperature
t2_tavg = ds.t2m.mean(dim='time') -273.15
ax = plt.axes(projection=ccrs.Robinson())
t2_tavg.plot(ax=ax, transform=ccrs.PlateCarree(), cmap='coolwarm', center=False,
vmin=-40, vmax=20, levels=10, cbar_kwargs={'label': '°C'})
ax.set_title('Average annual 2m air temperature, ERA5 1979-2018')
ax.coastlines(); ax.gridlines();
### plotting the zonal deviation of the mean temperature
t_avg_dep = t2_tavg - t2_tavg.mean(dim='longitude')
ax = plt.axes(projection=ccrs.Robinson())
t_avg_dep.plot.imshow(ax=ax, transform=ccrs.PlateCarree(), cbar_kwargs={'label': '°C'})
ax.coastlines(); ax.gridlines(); ax.set_title('Deviation from zonal average temperature');
Question 1:
Heat transport by the Gulf Stream, which is then transferred to the atmosphere and advected over western Europe. Seasonal heat storage by the ocean: the ocean absorbs heat in summer and release it in winter, warming downwind regions. Atmospheric heat transport, and quasi-stationary waves in the atmosphere.
The Northern Pacific does not have such a strong stream like the golf stream and is significantly larger, so that it would take much stronger streams to heat up. [https://nicklutsko.github.io/blog/2020/01/07/What-Keeps-Europe-Warm-In-Winter]
### calculating the monthly average temperature
t_m = ds.t2m.groupby('time.month').mean()
t_m.shape
(12, 241, 480)
### plotting the temperature range
t_mrange = t_m.max(dim='month')- t_m.min(dim='month')
ax = plt.axes(projection=ccrs.Robinson())
t_mrange.plot.imshow(ax=ax, transform=ccrs.PlateCarree(), cmap= 'BuPu', cbar_kwargs={'label': '°C'})
ax.coastlines(); ax.gridlines(); ax.set_title('average monthly temperature range');
Question 2:
- In the tropics is a consistant solar energy radiation, minimal season variation and therefore stable day and night lengths.
- Because water has a higher heat capacity than lands.
- The largest ranges are on continents at high latitudes due to the lack of ocean moderation and extreme seasonal changes in solar radiation.
[John and Plumb, R. Alan. Atmosphere, Ocean and Climate Dynamics: An introductory text, 2008]
Part 2 - Precipitation climatology¶
Open the precipitation file and explore it. The units of monthly precipitation are wrongly labeled (unfortunately). They should read: m per day.
dsp = xr.open_dataset('../data/ERA5_LowRes_Monthly_tp.nc')
dsp
<xarray.Dataset> Size: 444MB Dimensions: (longitude: 480, latitude: 241, time: 480) Coordinates: * longitude (longitude) float32 2kB -179.6 -178.9 -178.1 ... 178.9 179.6 * latitude (latitude) float32 964B 90.0 89.25 88.5 ... -88.5 -89.25 -90.0 * time (time) datetime64[ns] 4kB 1979-01-01 1979-02-01 ... 2018-12-01 Data variables: tp (time, latitude, longitude) float64 444MB ... Attributes: Conventions: CF-1.6 history: 2019-11-18 09:30:18 GMT by grib_to_netcdf-2.14.0: /opt/ecmw...
Using .groupby()
, compute the average daily precipitation for each month of the year (We expect a variable of dimensions (month: 12, latitude: 241, longitude: 480)). Convert the units to mm per day. Plot a map of average daily precipitation in January and in August with the levels [0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40]
and the colormap `YlGnBu'
Questions:
- Describe the location of the ITCZ in January and August. Without going into the details, explain (in one or two sentences)
- Describe the precipitation seasonality in West Africa and in India. Name the phenomenon at play.
### calculating the average daily percipitation per month
p_m = dsp.tp.groupby('time.month').mean()
p_m.shape
(12, 241, 480)
### converting the units
p_m = p_m *1000
### plotting for January
ax = plt.axes(projection=ccrs.Robinson())
p_m.sel(month=1).plot(ax=ax, transform=ccrs.PlateCarree(),
cmap='YlGnBu', levels=[0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40], cbar_kwargs={'label': 'mm per day'})
ax.coastlines(); ax.gridlines(); ax.set_title('Average daily precipitation in January');
### plotting for August
ax = plt.axes(projection=ccrs.Robinson())
p_m.sel(month=8).plot(ax=ax, transform=ccrs.PlateCarree(),
cmap='YlGnBu', levels=[0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40], cbar_kwargs={'label': 'mm per day'})
ax.coastlines(); ax.gridlines(); ax.set_title('Average daily precipitation in August');
Question 1:
Generally, the ITCZ can be found in the tropics. Visible in the plots, it moves further north in August and further south in January. A clear difference can be found in south-east Asia/India, where the ITCZ is clearly north of the Equator in August and south in January. The reason for this shift lies in movement of the solar zenith angle due to the tilt of the Earth's axis, which induces a shift in the zone of maximum convection. [Chapter 2 of the lecture]
Question 2:
In August, the ITCZ shifts northward over regions like India and West Africa, leading to significant rainfall in these areas. Conversely, in January, the ITCZ moves further south, resulting in reduced precipitation in these regions. As discussed in the lecture, this phenomenon is known as the monsoon — specifically, the Indian Summer Monsoon and the West African Monsoon. It is primarily driven by the differing heat capacities of land and ocean, which influence wind patterns. Consequently, these regions experience a rainy season during summer and a dry season during winter. [Chapter 2 of the lecture]
Part 3: sea-level pressure and surface winds¶
Open the file containing the surface winds (u10
and v10
) and sea-level pressure (msl
).
dsw = xr.open_dataset('../data/ERA5_LowRes_Monthly_uvslp.nc')
dsw
<xarray.Dataset> Size: 1GB Dimensions: (longitude: 480, latitude: 241, time: 480) Coordinates: * longitude (longitude) float32 2kB -179.6 -178.9 -178.1 ... 178.9 179.6 * latitude (latitude) float32 964B 90.0 89.25 88.5 ... -88.5 -89.25 -90.0 * time (time) datetime64[ns] 4kB 1979-01-01 1979-02-01 ... 2018-12-01 Data variables: u10 (time, latitude, longitude) float64 444MB ... v10 (time, latitude, longitude) float64 444MB ... msl (time, latitude, longitude) float64 444MB ... Attributes: Conventions: CF-1.6 history: 2019-11-24 19:42:05 GMT by grib_to_netcdf-2.14.0: /opt/ecmw...
Compute [¯SLP] (the temporal and zonal average of sea-level pressure). Convert it to hPa, and plot it (line plot). With the help of plt.axhline, add the standard atmosphere pressure line to the plot to emphasize high and low pressure regions. Repeat with [¯u10] and [¯v10] (in m s−1) and add the 0 horizontal line to the plot (to detect surface westerlies from easterlies for example).
Questions:
- Based on your knowledge about the general circulation of the atmosphere, explain the latitude location of the climatological high and low pressure systems of Earth.
- Similarly, explain the direction and strength of the zonal and meridional winds on earth (tip: the sea-level pressure plot helps)
### computing slp, converting to hPa
slp = (dsw.msl.mean(dim=['time', 'longitude'])) / 100
slp.plot(label = 'mean sea level pressure', color= 'orange');
plt.axhline(y= 1013.25, xmin=0.045, xmax=0.955, label='standard atmosphere pressure');
plt.legend(loc='lower right'); plt.xlabel('Latitude'); plt.ylabel('Mean sealevel pressure [hPa]'); plt.grid();
plt.title('temporal and zonal average of sea-level pressure in comparison to standard pressure');
Question 1:
At the equator solar heating causes air to rise and creates low pressure zones. At around 30° these airmasses descend and form subtropical highs. At 60° warm subtropic air meets cold polar air and creates subpolar lows. At the poles the dense, cold air sinks and creates polar highs. [Chapter 2 of the lecture]
u = dsw.u10.mean(dim=['time', 'longitude'])
v = dsw.v10.mean(dim=['time', 'longitude'])
u.plot(label = 'U-component of surface wind', color= 'orange');
v.plot(label = 'V-component of surface wind');
plt.axhline(y= 0, color= 'black');
plt.legend(loc='upper right'); plt.xlabel('Latitude'); plt.ylabel('Surface wind [m/s]'); plt.grid();
plt.title('Temporal and zonal averages of surface wind components');
Question 2:
Zonal winds:
Air moving from subtropical highs to the equatorial low, deflected by the Coriolis effect are easterly trade winds. Airmasses from the subtropical high to the subpolar low are also deflected by coriolis and are called westerlies. Air from polar highs moves toward subpolar lows, is deflected westward amd called polar easterlies. The westerly jet streams at 30° and 60°.
Meridional winds are driven by pressure gradients, stronger near low pressure systems, and of course also deflected by coriolis force.
Part 4: temperature change and CO2 concentrations¶
Download the global average CO2 concentration timeseries data in the CSV format (source: NOAA). Let us help you read them using pandas:
dfc = pd.read_csv('../data/co2_mm_gl.csv', skiprows=38)
# Combine the first two columns into a datetime column and set as index
dfc['date'] = pd.to_datetime(dfc.iloc[:, 0].astype(str) + '-' + dfc.iloc[:, 1].astype(str), format='%Y-%m')
dfc.set_index('date', inplace=True)
dfc
year | month | decimal | average | average_unc | trend | trend_unc | |
---|---|---|---|---|---|---|---|
date | |||||||
1979-01-01 | 1979 | 1 | 1979.042 | 336.56 | 0.11 | 335.92 | 0.10 |
1979-02-01 | 1979 | 2 | 1979.125 | 337.29 | 0.09 | 336.26 | 0.10 |
1979-03-01 | 1979 | 3 | 1979.208 | 337.88 | 0.11 | 336.51 | 0.10 |
1979-04-01 | 1979 | 4 | 1979.292 | 338.32 | 0.13 | 336.72 | 0.11 |
1979-05-01 | 1979 | 5 | 1979.375 | 338.26 | 0.04 | 336.71 | 0.11 |
... | ... | ... | ... | ... | ... | ... | ... |
2024-06-01 | 2024 | 6 | 2024.458 | 423.21 | 0.10 | 422.64 | 0.06 |
2024-07-01 | 2024 | 7 | 2024.542 | 421.52 | 0.10 | 422.83 | 0.06 |
2024-08-01 | 2024 | 8 | 2024.625 | 420.03 | 0.10 | 422.90 | 0.06 |
2024-09-01 | 2024 | 9 | 2024.708 | 420.25 | 0.10 | 423.09 | 0.06 |
2024-10-01 | 2024 | 10 | 2024.792 | 421.73 | 0.10 | 423.25 | 0.06 |
550 rows × 7 columns
Prepare three plots:
- plot the monthly global CO2 concentration as a function of time.
- plot the annual average timeseries of global CO2 concentration as a function of time.
- plot the annual average timeseries of global CO2 concentration and of global 2m temperature from ERA5 on the same plot (using a secondary y axis for temperature).
Questions:
- Describe and explain the annual cycle of CO2 concentrations
- What was the CO2 concentration in the atmosphere in the pre-industrial era? Compute the annual increase in CO2 concentration (unit: ppm per year) between 1980 and 1985 and between 2016 and 2021.
- Describe the relationship between global temperatures and CO2 concentrations. Beside CO2, name three processes that can influence temperature variability and change at the global scale.
### plotting monthly CO2 concentration
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12,6))
ax1.plot(dfc['average'].groupby(dfc.month).mean());
ax1.set_xlabel('Time'); ax1.set_ylabel('CO$_2$ concentration [ppm]'); ax1.grid();
ax1.set_title('seasonal cycle of global CO$_2$ concentration');
ax2.plot(dfc['average']);
ax2.set_xlabel('Time'); ax2.set_ylabel('CO$_2$ concentration [ppm]'); ax2.grid();
ax2.set_title('monthly global CO$_2$ concentration over time');
Question 1:
When looking at the plot above, a clear pattern for the annual cycle of CO2 emerges. CO2 concentrations rise in the autumn and winter of the Northern Hemisphere, reaching a maximum in April, and decrease in the northern-hemispheric spring/summer, until reaching a minimum in August. This is due to the different distribution of landmasses between the two hemispheres. During winter, plant material that was being produced in spring and summer starts to decay and releases CO2. Additionally, there are less plants removing CO2 from the atmosphere through photosynthesis, leading to a rise in CO2 concentration overall. In spring and summer, the exact opposite happens leading to a decrease in concentrations.
Sources:
Dessler, Andrew: Introduction to climate change, 2016
https://svs.gsfc.nasa.gov/4565, accessed on 08.01.2025
### plotting yearly average
dfc['average'].groupby(dfc.year).mean().plot();
plt.xlabel('Time'); plt.ylabel('CO$_2$ concentration [ppm]'); plt.grid();
plt.title('annual average timeseries of global CO$_2$ concentration');
Question 2:
- Preindustrial levels of CO2 are estimated around 280ppm [John and Plumb, R. Alan. Atmosphere, Ocean and Climate Dynamics: An introductory text, 2008].
- Between 1980 and 1985 the increase in CO2 concentration was 6.625ppm, that correspondes to around 1.33 ppm per year. Between 2016 and 2021 concentration rose by 11.638ppm or around 2.32ppm per year.
### computations for Question 2.2
# increase between 1980 and 1985
inc1 = dfc.loc[dfc['year'] == 1985, 'average'].mean() - dfc.loc[dfc['year'] == 1980, 'average'].mean()
print(inc1)
# increase between 2016 and 2021
inc2 = dfc.loc[dfc['year'] == 2021, 'average'].mean() - dfc.loc[dfc['year'] == 2016, 'average'].mean()
print(inc2)
6.624999999999943 11.637500000000045
### apply weight function to global temperature to get the right answer
weight = np.cos(np.deg2rad(ds.latitude))
weight = weight / weight.sum()
zonal_mean_t2 = ds.t2m.mean(dim='longitude') - 273.15 # convert into Celsius
weighted_zonal_mean_t2 = zonal_mean_t2 * weight
weighted_ts_t2_c = weighted_zonal_mean_t2.sum(dim='latitude')
tsa_t2 = weighted_ts_t2_c.resample(time='YS').mean()
fig, ax = plt.subplots()
x = dfc['year'].unique()
line1, = ax.plot(x, dfc['average'].groupby(dfc.year).mean(), label='global CO$_2$ concentration from NOAA')
axr = ax.twinx()
line2, = axr.plot(x[:-6], tsa_t2, color='orange', label='global 2m temperature from ERA5');
lines = [line1, line2]
labels = [line.get_label() for line in lines]
ax.legend(lines, labels, loc='lower right')
ax.set_xlabel('Time')
ax.set_ylabel('CO$_2$ concentration [ppm]')
axr.set_ylabel('global average temperature [°C]')
ax.set_title('Annual average timeseries comparison');
Describe the relationship between global temperatures and CO2 concentrations. Beside CO2, name three processes that can influence temperature variability and change at the global scale.
Question 3:
- When looking at the plot above, the relationship between global temperatures and the CO2 concentrations becomes clear: The annual average timeseries match up almost perfectly. Of course, the global temperature curve fluctuates much more as there are other influences that impact the annual global temperature in the short term, but the correlation is obvious.
- Besides the rising concentration of CO2 and other greenhouse gases in the atmosphere, other processes that can influence the climate variability and change at global scale are on the long-term the continental drift, fluctuations in the brightness of the sun or the orbit of the earth around the sun, and internal variability of earth's climate system such as ENSO or NAO. Of course, none of these factors is responsible for the rise of global temperatures we see at the moment. [Dessler, Andrew: Introduction to climate change, 2016]
Part 5: Climate Risk Dashboard (open research question)¶
We will use the Climate Risk Dashboard climate-risk-dashboard.climateanalytics.org from the Horizon 2020 PROVIDE Project to create and analyze an open research question. To learn how to use the dashboard, visit the OGGM-Edu website, which includes examples using mean temperature and glacier volume.
Select Indicators and Geography
- Choose two to three
Indicator
's from the dashboard. Ensure that you pick only oneIndicator
per Sector (e.g., one from Terrestrial Climate and one from Biodiversity). - Select a
GEOGRAPHY
for yourIndicator
's (not all geographies are available for all indicators).- Try to pick related locations. For example, if you choose a city, also consider selecting its country or region for comparison.
- Or, if it fits to your research question, you can also select an additional
GEOGRAPHY
for comparison (e.g. compare two countries), but you do not have to.
- Choose two to three
Formulate a Research Question
- Based on your selected
Indicator
's andGEOGRAPHY
, create a research question.- Please mention this research question clearly in your notebook.
- Your analysis will focus on comparing two to three scenarios available in the dashboard.
- Based on your selected
Conduct the Analysis
- Visualizations:
- Use at least one plot per
Indicator
by downloading plots directly from the dashboard. You can add them to your notebook with drag-and-drop. - Further, include at least two custom plots in your analysis. This means download the raw data from the dashboard and create your own plot. For an example see this section on OGGM-Edu. Please use the original filenames of the downloaded data in your notebook.
- Use at least one plot per
- References:
- Try to find at least one reference (reports, papers or articls) related to your research question and mention them in the notebook by providing a link. A good resource for many climate change related topics is the IPCC report.
- Visualizations:
Answer Guiding Questions to your Research Question
Answer at least three of the questions below, or come up with your own creative questions! You’re encouraged to mix and match the provided questions with your own ideas or explore different angles that interest you.
- How do the scenarios differ over time for each Indicator?
- What are the spatial differences between scenarios for each Indicator?
- If applicable: How much risk is avoided by staying below a certain threshold for your Indicator?
- Are there any correlations between your selected Indicators?
Part 5: Comparison of Temperature change and Heat Wave Days in Canada, USA and Mexico¶
For our own Research Question we selected the following indicators and geography:
- Heatwave days per year in 5 cities across nothern america: Toronto, New York, Los Angeles, Phoenix and Mexico City
- Mean surface temperature of Canada, USA and Mexico
We also used an IPCC article on the correlation between climate change and heatwaves in the United States. [https://www.ipcc.ch/apps/njlite/srex/njlite_download.php?id=6525]
Different scenarios we used
2020 Climate Politics: This scenario assumes that no further climate action is taken beyond the climate policies that were in place in 2020.
Delayed Climate Action: This scenario is based on a delayed decarbonisation in the 2030s. Fossil fuel use never ends but is instead compensated for with high amounts of carbon dioxide removal
The Shifting Pathway scenario: This scenario explores how a broader shift towards sustainable development can be combined with stringent climate policies. It is the most optimistic one, but rather unrealistic.
Our Research Questions
- How do the projected numbers of heatwave days per year and mean surface temperature trends differ over time under the "2020 Climate Policies," "Delayed Climate Action," and "Shifting Pathway" scenarios in Northern America?
- What are the spatial differences in the number of heatwave days and temperature changes across the selected cities (Toronto, New York, Los Angeles, Phoenix, and Mexico City) and countries (Canada, USA, and Mexico) under the climate scenarios?
- How does the probability of exceeding a 2.0°C temperature rise correlate with the increase in heatwave days, and how much risk is avoided in terms of both indicators under different scenarios?
Definition of a heat wave A heat wave is defined as a period of at least 3 consecutive days in which the maximum and minimum temperature exceeds the 90th percentile value of a reference present period (in this case 2011-2020). The first plots below compare the change of the number of days per year in such a heat wave in cities across Northern America.
file_paths = {
"curpol": [
("Los Angeles", "../data/impact-time_los_angeles_curpol_urbclim-heatwave-days_0.5_absolute.csv"),
("Mexico City", "../data/impact-time_mexico_city_curpol_urbclim-heatwave-days_0.5_absolute.csv"),
("New York", "../data/impact-time_new_york_curpol_urbclim-heatwave-days_0.5_absolute.csv"),
("Phoenix", "../data/impact-time_phoenix_curpol_urbclim-heatwave-days_0.5_absolute.csv"),
("Toronto", "../data/impact-time_toronto_curpol_urbclim-heatwave-days_0.5_absolute.csv"),
],
"delayed": [
("Los Angeles", "../data/impact-time_los_angeles_gs_urbclim-heatwave-days_0.5_absolute.csv"),
("Mexico City", "../data/impact-time_mexico_city_gs_urbclim-heatwave-days_0.5_absolute.csv"),
("New York", "../data/impact-time_new_york_gs_urbclim-heatwave-days_0.5_absolute.csv"),
("Phoenix", "../data/impact-time_phoenix_gs_urbclim-heatwave-days_0.5_absolute.csv"),
("Toronto", "../data/impact-time_toronto_gs_urbclim-heatwave-days_0.5_absolute.csv"),
],
}
def load_city_data(file_paths):
city_data = {}
for city, path in file_paths:
df = pd.read_csv(path)
city_data[city] = df[["year", "urbclim-heatwave-days_mean"]]
return city_data
# Daten laden
curpol_data = load_city_data(file_paths["curpol"])
delayed_data = load_city_data(file_paths["delayed"])
# Plot erstellen
plt.figure(figsize=(12, 6))
# Plot für 2020 policies
plt.subplot(1, 2, 1)
for city, data in curpol_data.items():
plt.plot(data["year"], data["urbclim-heatwave-days_mean"], marker="o", label=city)
plt.title("2020 policies")
plt.xlabel("Year")
plt.ylabel("Mean Heatwave Days")
plt.grid(True)
plt.ylim(10, 60)
plt.legend()
# Plot für delayed climate actions
plt.subplot(1, 2, 2)
for city, data in gs_data.items():
plt.plot(data["year"], data["urbclim-heatwave-days_mean"], marker="o", label=city)
plt.title("Delayed climate actions")
plt.xlabel("Year")
plt.ylabel("Mean Heatwave Days")
plt.grid(True)
plt.ylim(10, 60)
plt.legend()
# Layout anpassen und anzeigen
plt.tight_layout()
plt.show()
Analysis
The left plot shows for each city and for each year the median of the estimated change in the number of haetwave days per year. In 2020 we see that New York has the highest number of heatwave days per year und Mexico city the lowest. However, in the year 2100 Mexico City could have more heatwave days than every other city included if the policies stay the same as in 2020.
Additionally it stands out that there is quite a big difference in the number of heatwave days and its future between Los Angeles (blue line) and Phoenix (red line) altough they are only about 500 km away from each other. This may be due to their distinct climates and geographic features. Los Angeles benefits from the moderating influence of the Pacific Ocean, while Phoenix's desert climate may be naturally more prone to intense and frequent heatwaves. The urban heat island effect, which amplifies nighttime temperatures, may be also stronger in Phoenix due to less vegetation and greater urbanization, further contributing to the larger increase in heatwave days.
[https://www.ipcc.ch/apps/njlite/srex/njlite_download.php?id=6525]
We added the following two plots to show the uncertainty of the data we used in the previous plot. Again we used Los Angeles and Phoenix. Note that the y-axis are not coherent. We see that for the worst case one model estimated well over 80 heatwave days per year in phoenix instead of 55.4 (the median which went into our previous graph).
Note that heatwave days are not a appropriate value for the severeness of climate change in a region: We added the following plots to underline that though new york may have more heat wave days per year than pheonix, the days per year with extreme heat stress are much less, in fact currently only a fraction of those in pheonix for example. Same would of course count for Mexico City, but there was no plot available. However, considering the massive change in the number of heat days in mexico city, this makes it even more alarming as heat waves in Mexico City are much more severe than in the northern regions. Also Mexico City is the highest populated of these cities.
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6), sharey=True)
####################################################
# Load the three CSV files
file_paths_2020 = {
"Canada": "../data/impact-time_CAN_curpol_terclim-mean-temperature_0.5_pre-industrial.csv",
"Mexico": "../data/impact-time_MEX_curpol_terclim-mean-temperature_0.5_pre-industrial.csv",
"USA": "../data/impact-time_USA_curpol_terclim-mean-temperature_0.5_pre-industrial.csv",
}
dataframes = {name: pd.read_csv(path) for name, path in file_paths_2020.items()}
# Extract years and mean temperatures from each dataset
temperature_data = {
country: {
"year": df["year"],
"mean_temperature": df["terclim-mean-temperature_mean"],
}
for country, df in dataframes.items()
}
# Plot the data for ax1
for country, data in temperature_data.items():
ax1.plot(data["year"], data["mean_temperature"], label=country)
# Customize the plot for ax1
ax1.set_title("2020 policies", fontsize=16)
ax1.set_xlabel("Year", fontsize=14)
ax1.set_ylabel("Mean Temperature (°C)", fontsize=14)
ax1.legend(title="Country")
ax1.grid(True, linestyle="--", alpha=0.7)
#######################################################
file_paths_delayed = {
"Canada": "../data/impact-time_CAN_gs_terclim-mean-temperature_0.5_pre-industrial.csv",
"Mexico": "../data/impact-time_MEX_gs_terclim-mean-temperature_0.5_pre-industrial.csv",
"USA": "../data/impact-time_USA_gs_terclim-mean-temperature_0.5_pre-industrial.csv",
}
dataframes = {name: pd.read_csv(path) for name, path in file_paths_delayed.items()}
# Extract years and mean temperatures from each dataset
temperature_data = {
country: {
"year": df["year"],
"mean_temperature": df["terclim-mean-temperature_mean"],
}
for country, df in dataframes.items()
}
# Plot the data for ax2
for country, data in temperature_data.items():
ax2.plot(data["year"], data["mean_temperature"], label=country)
# Customize the plot for ax2
ax2.set_title("Delayed climate action", fontsize=16)
ax2.set_xlabel("Year", fontsize=14)
ax2.set_ylabel("Mean Temperature (°C)", fontsize=14)
ax2.legend(title="Country")
ax2.grid(True, linestyle="--", alpha=0.7)
# Show the plot
plt.tight_layout()
plt.show()
Analysis
The plot above illustrates projected mean temperature changes for Canada, the USA, and Mexico again under the two climate scenarios current 2020 policies and delayed climate action. In the "2020 policies" scenario, where no additional measures beyond those implemented by 2020 are taken, mean temperatures rise steadily throughout the century. Canada shows the most significant increase, exceeding 5°C by 2100. The USA and Mexico also experience notable warming, with increases of approximately 4°C and 3.5°C.
In contrast, the delayed climate action scenario suggests a different trajectory. Under this model, temperatures increase rapidly until mid-century but then stabilize or slightly decrease toward 2100. For Canada, the warming peaks around 3.5°C, while the USA and Mexico experience maximum increases of about 3°C and 2.5°C, respectively. This stabilization indicates that delayed action could eventually reduce the long-term warming trend, but the initial temperature rise remains substantial and unavoidable, particularly in the first half of the century.
The comparison highlights the strong differences between the two scenarios. The 2020 policies scenario results in continuous warming, with no signs of stabilization, whereas delayed climate action offers eventual mitigation. This analysis underscores the critical importance of timely and decisive climate interventions. Canada, being a northern country with a colder baseline climate, is particularly vulnerable to accelerated warming. The reason for this is probably mostly because of the albedo-effect, but also melting permafrost plays a big role.
The plot below shows basically the same, but not in respect to preindustrial times. Instead the changes are compared to the mean temperature in the period of 2011-2020.
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6), sharey=True)
####################################################
# Load the three CSV files
file_paths_2020 = {
"Canada": "../Klimasystem/data/impact-time_CAN_curpol_terclim-mean-temperature_0.5_present-day.csv",
"Mexico": "../Klimasystem/data/impact-time_MEX_curpol_terclim-mean-temperature_0.5_present-day.csv",
"USA": "../Klimasystem/data/impact-time_USA_curpol_terclim-mean-temperature_0.5_present-day.csv",
}
dataframes = {name: pd.read_csv(path) for name, path in file_paths_2020.items()}
# Extract years and mean temperatures from each dataset
temperature_data = {
country: {
"year": df["year"],
"mean_temperature": df["terclim-mean-temperature_mean"],
}
for country, df in dataframes.items()
}
# Plot the data for ax1
for country, data in temperature_data.items():
ax1.plot(data["year"], data["mean_temperature"], label=country)
# Customize the plot for ax1
ax1.set_title("2020 policies", fontsize=16)
ax1.set_xlabel("Year", fontsize=14)
ax1.set_ylabel("Mean Temperature (°C)", fontsize=14)
ax1.legend(title="Country")
ax1.grid(True, linestyle="--", alpha=0.7)
#######################################################
file_paths_delayed = {
"Canada": "../Klimasystem/data/impact-time_CAN_gs_terclim-mean-temperature_0.5_present-day.csv",
"Mexico": "../Klimasystem/data/impact-time_MEX_gs_terclim-mean-temperature_0.5_present-day.csv",
"USA": "../Klimasystem/data/impact-time_USA_gs_terclim-mean-temperature_0.5_present-day.csv",
}
dataframes = {name: pd.read_csv(path) for name, path in file_paths_delayed.items()}
# Extract years and mean temperatures from each dataset
temperature_data = {
country: {
"year": df["year"],
"mean_temperature": df["terclim-mean-temperature_mean"],
}
for country, df in dataframes.items()
}
# Plot the data for ax2
for country, data in temperature_data.items():
ax2.plot(data["year"], data["mean_temperature"], label=country)
# Customize the plot for ax2
ax2.set_title("Delayed climate action", fontsize=16)
ax2.set_xlabel("Year", fontsize=14)
ax2.set_ylabel("Mean Temperature (°C)", fontsize=14)
ax2.legend(title="Country")
ax2.grid(True, linestyle="--", alpha=0.7)
# Show the plot
plt.tight_layout()
plt.show()
Analysis
The last plots we added show the risk of exceeding a 2.0°C rise in mean temperature from 2011–2020 levels for Canada, the United States, and Mexico under the different climate scenarios, including now also the "shifting pathway".
In all countries, the current risk in 2011-2020 is zero. Under the 2020 climate policies, Canada faces the highest projected risk, with a 90% chance of exceeding 2.0°C by 2100. The United States follows with a 75% risk, while Mexico has a lower risk of 47%. With delayed action, all countries see their risks increase over time, with Canada reaching 75% by 2100. The Shifting Pathway scenario, however, offers a significant reduction in risk, with Canada, the U.S., and Mexico achieving near-zero risks by 2100. This emphasizes the crucial role of high ambition mitigation in reducing future temperature rise. Without such actions, all three countries face considerable risks, especially Canada, but aggressive mitigation could prevent these risks entirely.
Main result here is what we have seen above as well, but here in these plots it is even more distinct: Staying with our current climate policies would have dramatic effects, especially in times where current policy makers are already dead.
Conclusion: The probability of exceeding a 2.0°C temperature rise is closely linked to an increase in heatwave days, with higher warming under the "2020 Climate Policies" scenario driving significant increases in both mean temperatures and the frequency of extreme heat events. In contrast, the Delayed Climate action scenario limits warming to below 2.0°C by stabilizing temperatures by mid-century. This avoids substantial risks, reducing the probability of exceeding 2.0°C from 90% to under 20% in Canada, and near 0% in the United States and Mexico by 2100. Correspondingly, the rise in heatwave days is mitigated, particularly in cities like New York and Phoenix, where the 2020 policies climate scenario would otherwise lead to drastic increases in extreme heat events. Overall, the Delayed climate action scenario demonstrates significant avoided risk in both temperature rise and heatwave impacts compared to "2020 Climate Policies."