Marian Ebenbichler und Kilian Trummer
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 11 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: I 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. 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…). Every group member must submit the notebook on olat seperatly!!
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):
# 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
Open the ERA5 temperature data:
ds_temp = xr.open_dataset('ERA5_LowRes_Monthly_t2m.nc')
Plot three global maps:
.groupby()
command we learned in the lesson. Now plot the average monthly temperature range, i.e. ¯TMmax - ¯TMmin on a map.# Convert Kelvin to Celsius
ds_temp['t2m_celsius'] = ds_temp['t2m'] - 273.15
# Compute the temporal mean temperature in Celsius
t2_tavg_celsius = ds_temp['t2m_celsius'].mean(dim='time')
# Plotting the temporal mean temperature
ax = plt.axes(projection=ccrs.Robinson())
t2_tavg_celsius.plot(ax=ax, transform=ccrs.PlateCarree(), levels=[-40, -25, -10, 0, 5, 10, 15, 20, 30, 40], cmap='coolwarm')
ax.coastlines()
ax.gridlines()
plt.title('Temporal Mean Temperature (°C)')
plt.show()
#compute the zonal anomaly T*
t2_tavg_dep = t2_tavg_celsius - t2_tavg_celsius.mean(dim='longitude')
#plotting zonal anomaly T*
ax = plt.axes(projection=ccrs.Robinson())
t2_tavg_dep.plot.imshow(ax=ax, transform=ccrs.PlateCarree(), levels=[-40, -25, -10, 0, 5, 10, 15, 20, 30, 40], cmap='coolwarm')
ax.coastlines()
ax.gridlines()
plt.title('zonal anomaly map of temporal Mean Temperature (°C)')
plt.show()
# Group by month and compute the monthly average temperature
monthly_mean = ds_temp['t2m_celsius'].groupby('time.month').mean(dim='time')
# Plot annual cycle
fig, ax = plt.subplots(figsize=(12, 5))
monthly_mean.mean(dim=['longitude', 'latitude']).plot(ax=ax)
ax.set_title('Annual Cycle: Monthly Average Temperature')
ax.set_xlabel('Month')
ax.set_ylabel('Average Temperature (°C)')
ax.set_xticks(np.arange(1, 13, 1))
ax.set_xticklabels(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])
plt.grid(True)
plt.tight_layout()
plt.show()
# Compute the monthly temperature range (max - min) for each month
monthly_range = ds_temp['t2m_celsius'].groupby('time.month').max(dim='time') - ds_temp['t2m_celsius'].groupby('time.month').min(dim='time')
# Compute the average monthly temperature range
average_range = monthly_range.mean(dim='month')
# Plotting the average monthly temperature range on a map
plt.figure(figsize=(10, 6))
ax = plt.axes(projection=ccrs.Robinson())
average_range.plot(ax=ax, transform=ccrs.PlateCarree(), levels=[0, 3, 6, 9, 12, 15, 18, 21, 23], cmap='Greens')
ax.coastlines()
ax.gridlines()
plt.title('Average Monthly Temperature Range (°C)')
plt.tight_layout()
plt.show()
Questions:
Answers:
The warmer temperatures in Northern Europe and the North Atlantic region can be attributed to the warming effect of the North Atlantic Drift (a part of the Gulf Stream), which brings warm water from the Gulf of Mexico to the North Atlantic, moderating temperatures in those regions. So this differences can be explained by oceanic influence.
<u>Ocean Currents and Atmospheric Circulation: </u>
The Northern Pacific Ocean might not exhibit a similar pattern due to differences in ocean currents and atmospheric circulation compared to the North Atlantic. Also europe experiences a more maritime climate due to proximity to the ocean, which helps moderate temperatures compared to inland regions like North America or Russia. The Pacific's circulation patterns, like the [Pacific Decadal Oscillation (PDO)](https://psl.noaa.gov/pdo/), and the influence of currents like the [Kuroshio and Oyashio](https://en.wikipedia.org/wiki/Kuroshio_Current), create different temperature patterns.
The consistent high temperatures in the tropics lead to a smaller temperature range. Equatorial regions receive more consistent solar radiation throughout the year, resulting in minor seasonal variations and smaller temperature differences between months.
<u>Smaller Range Over Oceans Compared to Land:</u>
Water has a higher [heat capacity](https://www.carbonbrief.org/guest-post-why-does-land-warm-up-faster-than-the-oceans/) than land, meaning it can store more heat energy for longer periods, resulting in a smaller temperature range. Oceans moderate temperature changes by absorbing and releasing heat more slowly than land.
<U>Location of Largest Temperature Range:</u>
High Latitude continental areas like [Alaska and Northeast Russia](https://en.wikipedia.org/wiki/Taiga) exhibit the largest annual temperature ranges due to their inland continental positioning, distance from maritime influences, high latitudes leading to extreme variations in sunlight and Arctic influences affecting temperature patterns leading to large seasonal contrasts.
Open the precipitation file and explore it. The units of monthly precipitation are wrongly labeled (unfortunately). They should read: m per day.
Using .groupby()
, compute the average daily precipitation for each month of the year (I 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:
# Open the precipitation file
ds = xr.open_dataset('ERA5_LowRes_Monthly_tp.nc')
# Convert units to mm per day
ds['tp'] = ds['tp'] * 1000
# Group by month and compute average daily precipitation
avg_daily_precipitation = ds.groupby('time.month').mean(dim='time')
# Plot a map of average daily precipitation in January
plt.figure(figsize=(10, 5))
ax = plt.axes(projection=ccrs.Robinson())
avg_daily_precipitation.sel(month=1)['tp'].plot(levels=[0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40], cmap='YlGnBu', transform=ccrs.PlateCarree())
ax.coastlines()
ax.gridlines()
plt.title('Average Daily Precipitation in January')
plt.show()
# Plot a map of average daily precipitation in August
plt.figure(figsize=(10, 5))
ax = plt.axes(projection=ccrs.Robinson())
avg_daily_precipitation.sel(month=8)['tp'].plot(levels=[0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40], cmap='YlGnBu', transform=ccrs.PlateCarree())
ax.coastlines()
ax.gridlines()
plt.title('Average Daily Precipitation in August')
plt.show()
Description of the ITCZ in January and February: The Intertropical Convergence Zone (ITCZ) is a band of low pressure systems near the equator where trade winds converge. In January and February, the ITCZ is typically located near the equator, influencing the weather in tropical regions. It is characterized by ascending air, convective activity, and high precipitation.
Precipitation seasonality in West Africa and India: West Africa experiences a distinct wet and dry season known as the West African Monsoon. In this region, precipitation is highest during the summer months (June to August) when the ITCZ moves northward. India experiences a similar monsoon pattern known as the Indian Monsoon, with a wet season from June to September. The monsoons are driven by the seasonal reversal of winds and the influence of the ITCZ, bringing heavy rainfall during the summer months.
Open the file containing the surface winds (u10
and v10
) and sea-level pressure (msl
).
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:
# Open the dataset
ds = xr.open_dataset('ERA5_LowRes_Monthly_uvslp.nc')
# Compute the temporal and zonal average of sea-level pressure and convert to hPa
mean_slp = ds['msl'].mean(dim=['time', 'longitude']) / 100
# Compute the temporal and zonal average of u10 and v10
mean_u10 = ds['u10'].mean(dim=['time', 'longitude'])
mean_v10 = ds['v10'].mean(dim=['time', 'longitude'])
# Create a line plot for mean sea-level pressure
plt.figure(figsize=(10, 6))
mean_slp.plot(label='Mean Sea-Level Pressure', color='blue')
# Add standard atmosphere pressure line
plt.axhline(y=1013.25, color='red', linestyle='--', label='Standard Atmosphere Pressure')
# Set labels and title
plt.xlabel('Latitude')
plt.ylabel('Pressure (hPa)')
plt.title('Mean Sea-Level Pressure and Standard Atmosphere Pressure Line')
# Add legend
plt.legend()
# Show the plot
plt.show()
# Create line plots for mean u10 and v10
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10), sharex=True)
mean_u10.plot(ax=ax1, label='Mean $u_{10}$', color='green')
mean_v10.plot(ax=ax2, label='Mean $v_{10}$', color='orange')
# Add horizontal line at y=0 for wind components
ax1.axhline(y=0, color='black', linestyle='--', label='Zero line')
ax2.axhline(y=0, color='black', linestyle='--', label='Zero line')
# Set labels and titles
ax1.set_ylabel('$u_{10}$ (m/s)')
ax2.set_ylabel('$v_{10}$ (m/s)')
plt.xlabel('Latitude')
ax1.set_title('Mean Zonal Wind ($u_{10}$) and Zero Line')
ax2.set_title('Mean Meridional Wind ($v_{10}$) and Zero Line')
# Add legends
ax1.legend()
ax2.legend()
# Show the plots
plt.show()
Latitude location of climatological high and low pressure systems:
High-Pressure Systems (Subtropical Highs): The climatological high-pressure systems are typically located around 30 degrees latitude, both in the Northern and Southern Hemispheres. These are known as subtropical highs. The descending air in these regions leads to clear skies and generally fair weather.
Low-Pressure Systems (Subpolar Lows and Equatorial Lows): Low-pressure systems are found at around 60 degrees latitude (subpolar lows) and near the equator (equatorial lows). These areas are characterized by ascending air, leading to the development of clouds and often precipitation.
Direction and strength of zonal and meridional winds:
Zonal Winds (East-West): The zonal winds (represented by u10) exhibit a pattern from east to west and west to east at different latitudes. The plot helps in visualizing the dominant wind direction. Near the equator, easterly trade winds prevail, while at higher latitudes, westerlies dominate.
Meridional Winds (North-South): The meridional winds (represented by v10) show a pattern from north to south and south to north. Near the equator, there are weak meridional winds, but at higher latitudes, meridional components become more pronounced.
In summary, the sea-level pressure plot helps identify the positions of high and low-pressure systems, and the wind component plots provide insights into the direction and strength of zonal and meridional winds across latitudes.
Download the global average CO2 concentration timeseries data in the CSV format (source: NOAA). Here, let me help your read them using pandas:
Prepare three plots:
Questions:
# Skip 55 rows
df = pd.read_csv('co2_mm_gl.csv', skiprows=55, parse_dates={'date' : [0, 1]}, index_col='date', engine='python', date_format='%Y %m')
# Rename the columns appropriately
df.columns = ['year_decimal', 'interpolated', 'trend', 'days', 'days_interpolated']
# Convert 'interpolated' column to numeric
df['interpolated'] = pd.to_numeric(df['interpolated'], errors='coerce')
# Resample to get annual averages
annual_average_co2 = df['interpolated'].resample('Y').mean()
# Resample to get annual averages for temperature
annual_average_temp = ds_temp['t2m_celsius'].mean(dim=['longitude', 'latitude']).resample(time='Y').mean()
# Plotting
fig, ax1 = plt.subplots(figsize=(12, 6))
plt.grid(True)
color = 'tab:blue'
ax1.set_xlabel('Date')
ax1.set_ylabel('CO2 Concentration (ppm)', color=color)
ln1 = ax1.plot(annual_average_co2.index, annual_average_co2, color=color, label='CO2 Concentration')
ln2 = ax1.plot(df.index, df['interpolated'], label='Monthly CO2 Concentration', color = 'black')
ax1.tick_params(axis='y', labelcolor=color)
ax2 = ax1.twinx()
color = 'tab:red'
ax2.set_ylabel('Temperature (°C)', color=color)
ln3 = ax2.plot(annual_average_temp.coords['time'], annual_average_temp, color=color, label='Global 2m Temperature')
ax2.tick_params(axis='y', labelcolor=color)
plt.xlabel('Date')
plt.ylabel('CO2 Concentration (ppm)')
plt.title('Average Global CO2 Concentration and mean Temperature')
# Add a common legend
lns = ln1 + ln2 + ln3
labs = [l.get_label() for l in lns]
ax1.legend(lns, labs, loc='upper left')
plt.show()
The annual cycle of CO2 concentrations is likely related to seasonal variations in natural processes such as plant growth and decay. During the spring and summer months, plants tend to absorb more CO2 through photosynthesis, leading to a decrease in atmospheric CO2 concentrations. In contrast, during the fall and winter months, when plant activity is reduced, CO2 concentrations tend to rise due to decreased photosynthetic activity(source). This cyclical pattern is often referred to as the "Keeling Curve" named after Charles David Keeling, who initiated measurements of atmospheric CO2 concentrations at Mauna Loa Observatory.
#2.
# CO2 concentration in the pre-industrial era
pre_industrial_co2 = 280 # parts per million
# Annual increase in CO2 concentration between 1980 and 1985
co2_increase_1980_1985 = (annual_average_co2.loc['1985-12-31'] - annual_average_co2.loc['1980-12-31']) / 5
# Annual increase in CO2 concentration between 2016 and 2021
co2_increase_2016_2021 = (annual_average_co2.loc['2021-12-31'] - annual_average_co2.loc['2016-12-31']) / 5
print(f"Pre-industrial CO2 concentration: {pre_industrial_co2} ppm")
print(f"Annual increase in CO2 concentration (1980-1985): {co2_increase_1980_1985:.2f} ppm per year")
print(f"Annual increase in CO2 concentration (2016-2021): {co2_increase_2016_2021:.2f} ppm per year")
Pre-industrial CO2 concentration: 280 ppm Annual increase in CO2 concentration (1980-1985): 1.42 ppm per year Annual increase in CO2 concentration (2016-2021): 2.33 ppm per year
Relationship between Global Temperatures and CO2 Concentrations: The relationship between global temperatures and CO2 concentrations is central to the understanding of climate change. Increased CO2 concentrations in the atmosphere contribute to the greenhouse effect, trapping more heat and leading to a warming of the Earth's surface. This positive feedback loop intensifies as higher temperatures can, in turn, release additional CO2 from natural reservoirs, such as permafrost.
Three processes influencing temperature variability and change at the global scale, besides CO2 concentrations, include:
Solar Radiation Variability: Changes in the sun's output can influence global temperatures.
Volcanic Activity: Large volcanic eruptions can inject aerosols into the stratosphere, reflecting sunlight and cooling the Earth.
Oceanic Processes: Ocean currents and cycles, such as El Niño and La Niña, can impact global temperature patterns by redistributing heat across the oceans.
As of November 2023, the world is currently experiencing El Niño conditions, with projections indicating its persistence through the upcoming spring (source). To understand the implications and compare with La Niña, we will utilize our available data.
Using your learned skills, you should create global anomalie maps of sea-surface temperature, precipitation, and air temperature, comparing one El Niño with one La Niña year. Describe the anomaly patterns you are seeing in your plots (e.g. where do we see an increase/decrease in precipitation). what are the differences globally and also you can choose a interesting region and describe the differences there. We suggest to look for literature or a google search on strong ENSO events in the past 40 years, and select one good example for a positive and a negative phase. With citation or links, explain why you picked these years as examples.
ds_prec = xr.open_dataset('ERA5_LowRes_Monthly_tp.nc')
ds_sst = xr.open_dataset('ERA5_LowRes_Monthly_sst.nc')
ds_temp = xr.open_dataset('ERA5_LowRes_Monthly_t2m.nc')
# Convert temperature data from Kelvin to Celsius
ds_temp['t2m'] = ds_temp['t2m'] - 273.15
baseline_temp = ds_temp['t2m'].mean(dim='time')
ds_sst = xr.open_dataset('ERA5_LowRes_Monthly_sst.nc')
baseline_sst = ds_sst['sst'].mean(dim='time')
ds_prec = xr.open_dataset('ERA5_LowRes_Monthly_tp.nc')
# Convert units to mm per day
ds_prec['tp'] = ds_prec['tp'] * 1000
baseline_prec = ds_prec['tp'].mean(dim='time')
# Subset the data for El Niño (1997-1998) and La Niña (August 2010 - July 2011) years
elnino_years_start = '1997-08-01'
elnino_years_end = '1998-07-31'
lanina_years_start = '2010-08-01'
lanina_years_end = '2011-07-31'
# Subsetting the data for El Niño
elnino_years_temp = ds_temp['t2m'].sel(time=slice(elnino_years_start, elnino_years_end))
elnino_years_sst = ds_sst['sst'].sel(time=slice(elnino_years_start, elnino_years_end))
elnino_years_prec = ds_prec['tp'].sel(time=slice(elnino_years_start, elnino_years_end))
# Subsetting the data for La Niña
lanina_years_temp = ds_temp['t2m'].sel(time=slice(lanina_years_start, lanina_years_end))
lanina_years_sst = ds_sst['sst'].sel(time=slice(lanina_years_start, lanina_years_end))
lanina_years_prec = ds_prec['tp'].sel(time=slice(lanina_years_start, lanina_years_end))
# Calculate anomalies for temperature
anomalies_temp_elnino = elnino_years_temp - baseline_temp
anomalies_temp_lanina = lanina_years_temp - baseline_temp
# Calculate anomalies for sea-surface temperature (SST)
anomalies_sst_elnino = elnino_years_sst - baseline_sst
anomalies_sst_lanina = lanina_years_sst - baseline_sst
# Calculate anomalies for precipitation
anomalies_prec_elnino = elnino_years_prec - baseline_prec
anomalies_prec_lanina = lanina_years_prec - baseline_prec
# Plotting zonal anomaly for Temperature
fig, ax = plt.subplots(subplot_kw={'projection': ccrs.Robinson()})
anomalies_temp_elnino.mean(dim='time').plot(ax=ax, transform=ccrs.PlateCarree(),levels=[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5])
ax.coastlines()
ax.gridlines()
plt.title('Zonal Anomaly Map of Temperature for El Niño (1997-1998)')
plt.show()
# Repeat the same for SST and Precipitation anomalies
fig, ax = plt.subplots(subplot_kw={'projection': ccrs.Robinson()})
anomalies_sst_elnino.mean(dim='time').plot(ax=ax, transform=ccrs.PlateCarree(),levels=[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5])
ax.coastlines()
ax.gridlines()
plt.title('Zonal Anomaly Map of SST for El Niño (1997-1998)')
plt.show()
fig, ax = plt.subplots(subplot_kw={'projection': ccrs.Robinson()})
anomalies_prec_elnino.mean(dim='time').plot(ax=ax, transform=ccrs.PlateCarree(),levels=[-8, -6, -4, -2, 0, 2, 4, 6, 8])
ax.coastlines()
ax.gridlines()
plt.title('Zonal Anomaly Map of Precipitation for El Niño (1997-1998)')
plt.show()
# Plotting zonal anomaly for Temperature during La Niña
fig, ax = plt.subplots(subplot_kw={'projection': ccrs.Robinson()})
anomalies_temp_lanina.mean(dim='time').plot(ax=ax, transform=ccrs.PlateCarree(),levels=[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5])
ax.coastlines()
ax.gridlines()
plt.title('Zonal Anomaly Map of Temperature for La Niña (2010-2011)')
plt.show()
# Plotting zonal anomaly for SST during La Niña
fig, ax = plt.subplots(subplot_kw={'projection': ccrs.Robinson()})
anomalies_sst_lanina.mean(dim='time').plot(ax=ax, transform=ccrs.PlateCarree(),levels=[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5])
ax.coastlines()
ax.gridlines()
plt.title('Zonal Anomaly Map of SST for La Niña (2010-2011)')
plt.show()
# Plotting zonal anomaly for Precipitation during La Niña
fig, ax = plt.subplots(subplot_kw={'projection': ccrs.Robinson()})
anomalies_prec_lanina.mean(dim='time').plot(ax=ax, transform=ccrs.PlateCarree(),levels=[-8, -6, -4, -2, 0, 2, 4, 6, 8])
ax.coastlines()
ax.gridlines()
plt.title('Zonal Anomaly Map of Precipitation for La Niña (2010-2011)')
plt.show()
# Zooming in on the specified region for Temperature anomalies during El Niño (1997-1998)
fig, ax = plt.subplots(subplot_kw={'projection': ccrs.PlateCarree()})
anomalies_temp_elnino.mean(dim='time').sel(latitude=slice(35, -35), longitude=slice(-130, -50)).plot(ax=ax, transform=ccrs.PlateCarree(),levels=[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5])
ax.coastlines()
ax.gridlines()
plt.title('Zonal Anomaly Map of Temperature for El Niño (1997-1998)')
plt.show()
# Zooming in on the specified region for SST anomalies during El Niño (1997-1998)
fig, ax = plt.subplots(subplot_kw={'projection': ccrs.PlateCarree()})
anomalies_sst_elnino.mean(dim='time').sel(latitude=slice(35, -35), longitude=slice(-130, -50)).plot(ax=ax, transform=ccrs.PlateCarree(),levels=[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5])
ax.coastlines()
ax.gridlines()
plt.title('Zonal Anomaly Map of SST for El Niño (1997-1998)')
plt.show()
# Zooming in on the specified region for Precipitation anomalies during El Niño (1997-1998)
fig, ax = plt.subplots(subplot_kw={'projection': ccrs.PlateCarree()})
anomalies_prec_elnino.mean(dim='time').sel(latitude=slice(35, -35), longitude=slice(-130, -50)).plot(ax=ax, transform=ccrs.PlateCarree(),levels=[-8, -6, -4, -2, 0, 2, 4, 6, 8])
ax.coastlines()
ax.gridlines()
plt.title('Zonal Anomaly Map of Precipitation for El Niño (1997-1998)')
plt.show()
# Zooming in on the specified region for zonal Temperature anomaly during La Niña (2010-2011)
fig, ax = plt.subplots(subplot_kw={'projection': ccrs.PlateCarree()})
anomalies_temp_lanina.mean(dim='time').sel(latitude=slice(35, -35), longitude=slice(-130, -50)).plot(ax=ax, transform=ccrs.PlateCarree(),levels=[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5])
ax.coastlines()
ax.gridlines()
plt.title('Zonal Anomaly Map of Temperature for La Niña (2010-2011)')
plt.show()
# Zooming in on the specified region for SST anomaly during La Niña (2010-2011)
fig, ax = plt.subplots(subplot_kw={'projection': ccrs.PlateCarree()})
anomalies_sst_lanina.mean(dim='time').sel(latitude=slice(35, -35), longitude=slice(-130, -50)).plot(ax=ax, transform=ccrs.PlateCarree(),levels=[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5])
ax.coastlines()
ax.gridlines()
plt.title('Zonal Anomaly Map of SST for La Niña (2010-2011)')
plt.show()
# Zooming in on the specified region for Precipitation anomaly during La Niña (2010-2011)
fig, ax = plt.subplots(subplot_kw={'projection': ccrs.PlateCarree()})
anomalies_prec_lanina.mean(dim='time').sel(latitude=slice(35, -35), longitude=slice(-130, -50)).plot(ax=ax, transform=ccrs.PlateCarree(),levels=[-8, -6, -4, -2, 0, 2, 4, 6, 8])
ax.coastlines()
ax.gridlines()
plt.title('Zonal Anomaly Map of Precipitation for La Niña (2010-2011)')
plt.show()
Interpretation
Temperature Anomalies: Positive anomalies indicate temperatures higher than the long-term average, while negative anomalies show temperatures lower than average.
In the El Niño year 1997/98 one can see positive anomalies especially in the eastern part of the pacific also inflencing most of south america. But also the northern part of the USA up to canada/alaska, major parts of africa and southeast-asia have higher temperatures than average. When looking at negative anomalies. We can see the strongest one in the northern part of Russia (especially in sibiria). The western part of the USA also had colder temperatures than average.
In the La Niña year 2010/11 it is pretty much the opposite to the El Niño event. The USA had positive temperature anomalies in the more southern parts and negative anomalies in the north-western part (also alaska). We can find the strongest anomalies in the most northern parts of the earth (greenland and also norther russia/sibiria). In europe, south-america and most parts of africa and asia the anomalies are not too strong. Australia had cooler temperatures than average.
SST Anomalies: El Niño caused a widespread warming of SSTs in the central and eastern equatorial Pacific, signifying positive SST anomalies. La Niña shows cooler-than-average SSTs in the same region. Whereas we see apart from that region globally colder SSTs than usual in the El Niño year and rather warmer SSTs than average in the La Niña year globally.
Precipitation Anomalies: El Niño brought increased rainfall to some regions (e.g., parts of South America (mostly uruguay)) and droughts to others (e.g. southeast-asia). The region with the biggest positive anomaly was the equatorial pacific. La Niña tends to have the opposite effects. Meaning a surplus in precipitation in south-east asia and rather average to less than average precipitation in the pacific.
We chose the eastern-pacific region and looked at a bit of a larger area reaching up to middle america and a larger part of south america, because the Pacific Ocean, particularly the central and eastern equatorial Pacific, is the primary region where the El Niño-Southern Oscillation (ENSO) originates. During the 1997-1998 El Niño, the eastern Pacific experienced warmer temperatures, leading to elevated sea surface temperatures. This resulted in higher temperatures in large parts of south and middle america. Conversely, the 2010-2011 La Niña brought cooler-than-average sea surface temperatures. We can also see a surplus in rainfall in parts of Central and Northern South America compared to typical climates.
El Niño 1997-1998: Strength: One of the strongest El Niño events on record, causing extreme weather globally; Impact: Resulted in floods, droughts, and heatwaves across various regions; Scientific Focus: Extensively studied and documented, serving as a benchmark event in ENSO research. References: esa, dwd, Bildungsserver.Hamburg
La Niña 2010-2011: Contrast: Followed a strong El Niño, characterized by cooler-than-average sea surface temperatures; Impact: Influenced global weather patterns, altering precipitation and temperatures; Insightful Period: Provided valuable data on La Niña's counterbalancing effects after a significant El Niño. References: Australien bureau of meteo, NOAA Impacts, Wikipedia