Group project: the Climate System¶
by Florian Zellmer and Manuela Jänisch
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 12 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 my 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…).
Please be concise in your answer. I 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
I 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)
1 2 3 4 5 6 7 8 9 | # 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:
1 | ds = xr.open_dataset(r'./data/ERA5_LowRes_Monthly_t2m.nc') |
Plot three global maps:
- Compute and plot the temporal mean temperature $\overline{T}$ for the entire period (unit °C)
- Compute and plot $\overline{T^{*}}$ (see lesson), the zonal anomaly map of average temperature.
- Compute the monthly average temperature for each month $\overline{T_M}$ (annual cycle). I 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, i.e. $\overline{T_M}max$ - $\overline{T_M}min$ on a map.
1 2 3 4 5 6 | # Compute and plot the temporal mean temperature for the entire period (unit °C) t2_tavg = ds.t2m.mean(dim='time') - 273.15 ax = plt.axes(projection=ccrs.Robinson()) t2_tavg.plot(ax=ax, transform=ccrs.PlateCarree(), cbar_kwargs={'label': '2m temperature in °C'}) ax.coastlines(); ax.gridlines() ax.set_title('temporal mean temperature $\overline{T}$ from 1979 to 2018 in °C', fontsize=18); |
1 2 3 4 5 6 | # Compute and plot the zonal anomaly map of average 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': '2m temperature anomaly in °C'}) ax.coastlines(); ax.gridlines() ax.set_title('zonal temperature anomaly $\overline{T^{*}}$ in °C', fontsize=18); |
Questions:
- Look at the zonal temperature anomaly map.
- Explain why norther 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.
Answer:
Northern Europe and the north Atlantic region is significantly warmer because of the North Atlantic Oscillation / Gulf stream: It is a warm ocean current that is responsible for mild climate in the region in winter. The effect of the warm surface water can be detected near surface due to sensible heat flux, and thus measured as a temperature anomaly (lecture slides, chapter 04, sl.14,19,21). Since land has a much lower heat capacity the water, the boreal winters effect the temperature in North America and Russia the most, leading to cold anomalies. In the pacific the most present currents at these latitudes are the Oya-schio (cold) and the pacific stream (warm) (Diercke World Atlas, p. 220 and 227, less relevant than gulf: not even depicted in Marshall/Plumb, p. 252), balancing each other, such that the effect of water heat capacity is not amplified by water temperature.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # Compute the monthly average temperature for each month $\overline{T_M}$ (annual cycle) t2_monthly_mean = ds.t2m.groupby('time.month').mean(dim='time')-273.15 t2_monthly_max = ds.t2m.groupby('time.month').max(dim='time')-273.15 t2_monthly_min = ds.t2m.groupby('time.month').min(dim='time')-273.15 t2_monthly_diff = t2_monthly_max - t2_monthly_min import matplotlib.gridspec as gridspec fig = plt.figure(figsize=(20, 10)) fig.suptitle('monthly average temperature ranges (Tmax - Tmin) from 1979 to 2018',y=0.95,fontsize=20) heights=[15,4,15,4,15,4,15] gs = gridspec.GridSpec(7, 3,height_ratios=heights) gp = gs.get_grid_positions(fig) month_names = ['January','February','March','April','May','June','July','August','September','October','November','December'] for i in range(4): for j in range(3): rect = [gp[2][j], gp[0][2*i], gp[3][j]-gp[2][j], gp[1][2*i]-gp[0][2*i]] # [left, bottom, width, height] ax = plt.axes(rect,projection=ccrs.Robinson()) fig.add_axes(ax) t2_monthly_diff.sel(month=3*i+j+1,method='nearest').plot.imshow(ax=ax, transform=ccrs.PlateCarree(), cbar_kwargs={'label': '2m temp. in °C'}) ax.set_title(month_names[3*i+j]); ax.coastlines(); ax.gridlines(); |
1 2 3 4 5 6 7 8 | # the first try seems way too complicated, so here's another one: t2_monthly_mean_max = t2_monthly_mean.max(dim='month') t2_monthly_mean_min = t2_monthly_mean.min(dim='month') t2_monthly_mean_diff = t2_monthly_mean_max - t2_monthly_mean_min ax = plt.axes(projection=ccrs.Robinson()) t2_monthly_mean_diff.plot.imshow(ax=ax, transform=ccrs.PlateCarree(), levels=[1, 5, 10, 15, 20, 25, 30, 40, 50, 60], cbar_kwargs={'label': '2m temperature range in °C'}) ax.coastlines(); ax.gridlines() ax.set_title('monthly average temperature ranges (Tmax - Tmin) from 1979 to 2018',fontsize=18); |
Questions:
- 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.
Answer:
The meridional differences in temperature ranges are due to the tilting of earth rotation axis. This causes the days - time of solar insulation at a given point - to vary with the seasons, longer in summer and shorter in winter (extremes: polar day/night). With this varying incoming shortwave energy, the conversion to longwave radiation and with that to temperature changes stronger of the course of the year, as you go higher in latitude.
The temperature range over oceans is smaller than over land due to the much higher heat capacity of water, which acts as a damper to temperature changes. Over land, since heat capacity is lower, temperature is much stronger coupled to heat fluxes, resulting in greater changes.
Largest temperature range is in Siberia, where the effect of low heat capacity over land is amplified by the strong Siberian High during winter, allowing for net energy loss because of the missing cloud cover due to subsidence. (Britannica)
Also, there can be strong temperature inversions in winter, leading to stable conditions, therefore strong cooling and very cold temperatures.
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.
1 | ds1 = xr.open_dataset(r'./data/ERA5_LowRes_Monthly_tp.nc') |
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'
1 2 3 4 5 6 | # Your answers here tp_monthly_mean = ds1.tp.groupby('time.month').mean()*1000 ax = plt.axes(projection=ccrs.Robinson()) tp_monthly_mean[0].plot(ax=ax, transform=ccrs.PlateCarree(), levels=[0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40], cmap='YlGnBu', cbar_kwargs={'label': 'precipitation in mm/d'}) ax.coastlines(); ax.gridlines() ax.set_title('average daily precipitation in january',fontsize=18); |
1 2 3 4 | ax = plt.axes(projection=ccrs.Robinson()) tp_monthly_mean[7].plot(ax=ax, transform=ccrs.PlateCarree(), levels=[0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40], cmap='YlGnBu', cbar_kwargs={'label': 'precipitation in mm/d'}) ax.coastlines(); ax.gridlines() ax.set_title('average daily precipitation in august',fontsize = 18); |
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.
Answer:
The ITCZ in January is located south of the equator is located around 10-15° S from africa going eastwards to australia and half of the pacific ocean, and slightly north of the equator in the eastern part of the pacific ocean as well as the atlantic, whereas in the amazon region, it is located again about 10° S. This can be seen in the plot by the precipitation maxima.
The ITCZ in August is located further north: About 10° N throughout the pacific and going eastwards until almost east coast of africa, where there is a break. Over southern and south eastern Asia it is delocated further north, with the maximum altitude being at the himalaya mountain range.
The seasonal shift can be explained by the obliquity of the earth, leading to a meridional change of the zenith of the sun throughout the year. In NH summer, the zenith of the sun is about 20° N (max. at 23.5° N on NH summer solstice, 21.6.), leading to lots of convection and precipitation in those latitudes. In SH summer, it is the mirror image: with the zenith of the sun being around 20° S (max. at 23.5° S on SH summer solstice, 21.12.), again determining the zone of converging trade winds at the surface due to the convection and subsequent hadley circulation. (Marshall/Plumb, chap. 5.1, 5.4.1, 8.2.1)
West Africa and India get close to no precipitation in January, whereas in August they are influenced by the northwards shift of the ITCZ, leading to precipitation maxima of more than 20 mm/d averaged over the entire month. The phenomenon is called monsoon: Due to the north shift of the ITCZ, South easterly trade winds will now cross the equator, thereby turning into south westerly monsoon, that transports lots of moist air from the atlantic/indian ocean towards the land, leading to convection and heavy rainfall in West Africa and India. The monsoon system - land-sea breeze or the ITCZ?, Gadgil
Part 3: sea-level pressure and surface winds¶
Open the file containing the surface winds (u10
and v10
) and sea-level pressure (msl
).
1 | ds2 = xr.open_dataset(r'./data/ERA5_LowRes_Monthly_uvslp.nc') |
Compute $\left[ \overline{SLP} \right]$ (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 $\left[ \overline{u_{10}} \right]$ and $\left[ \overline{v_{10}} \right]$ (in m s$^{-1}$) and add the 0 horizontal line to the plot (to detect surface westerlies from easterlies for example).
1 2 3 4 5 6 7 | (ds2.msl.mean(dim=['time', 'longitude'])* 0.01).plot(label='$\\left[ \\overline{SLP} \\right]$') plt.ylabel('$\\left[ \\overline{SLP} \\right]$ [hPa]') plt.xlabel('latitude [°N]') plt.title('The temporal and zonal average of sea-level pressure [hPa]') plt.axhline(y=1013.25, linewidth=3, color='r', label='standard atmosphere pressure \n at 1013.25 hPa') plt.grid() plt.legend(); |
1 2 3 4 5 6 7 8 | ds2.u10.mean(dim=['time', 'longitude']).plot(label='$\\left[ \\overline{u_{10}} \\right]$ zonal') ds2.v10.mean(dim=['time', 'longitude']).plot(label='$\\left[ \\overline{v_{10}} \\right]$ meridional') plt.ylabel('surface wind [m/s]') plt.xlabel('latitude [°N]') plt.title('Zonal and meridional wind') plt.axhline(y=0, linewidth=3, color='r', label= '0 horizontal line') plt.grid() plt.legend(); |
Question:
- 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.
Answer:
Due to the spherical shape of the earth, the inclination of the earth's axis and the elliptical orbit of the earth around the sun there are differences in the amount of energy supplied by the sun and thus pronounced temperature differences between the tropics and the polar regions. This results in the global distribution of near-surface pressure formations and wind belts. At the equator lie the thermal low pressure cells of the Innertropical Convergence Zone. The subtropical high pressure belts associated with the ITCZ converge at about 30° north and south latitude. Poleward follows a transition zone between tropical warm air and polar cold air, the so-called planetary frontal zone. This is characterized by the jet stream and its dynamic low pressure areas. At the poles lie cold highs. Between the air pressure areas, there are three different wind systems in each hemisphere: the easterly winds dominating at the poles, the westerly wind drift caused by the jetstream, and the trade winds. With the seasonal change of the sun's position, the pressure areas and the winds blowing between them shift about 5-8 degrees of latitude to the north or south. Thus, certain latitude zones are characterized by different air pressure and wind conditions depending on the season.
Question:
- Similarly, explain the direction and strength of the zonal and meridional winds on earth (tip: the sea-level pressure plot helps)
Answer:
Between 75°N - 90°N are the cold highs. There the weak zonal wind (ZW) blows to the east and the weak meridional wind (MW) to the north. In the southern hemisphere 75°S - 90°S the outlets of the low pressure areas can be seen. In this area, ZW blows mostly to the west and MW to the north. At the poles, the strength of the two winds is fairly balanced.
In the northern hemisphere in the area of the subpolar low pressure trough, there are mainly easterly winds (ZW: 68°N - 75°N), but also variable winds, with ZW blowing to the west (55°N - 68°N) and MW blowing towards the equator. Compared to this, ZW runs west to east from 55°S to 65°S and to the east between 65°S - 75°S. Also MW blows mostly towards the equator, only in the smaller sub-area of 55°S - 62°S MW blows towards the southern pole. So the wind direction is quite similar to the northern hemisphere.
Around the subtropical high pressure belt is the planetary frontal zone with ZW from the west as well as weaker MW to the poles (30°N - 55°N, 35°S - 55°S). However, it should be emphasized that the zonal westerly wind is most pronounced at about 60°S, at about 7 m/s, and the surface pressure near this location has the lowest values, with the MW blowing at a much lower speed of 1 m/s in contrast.
The equatorial trough of low pressure and the trade wind circulation (25°S - 25°N) is located in the tropics. The wind is most deflected at the equator by the Coriolis force, which is why the zonal wind blows to the west. Furthermore, MW blows toward the equator in this area. In addition, ZW is about twice as strong as MW there. (strong orientation to the two figures from this exercise 3 and also helpful sources: http://www.gerd-pfeffer.de/zirk_zirkulation.html, book (p. 134): Atmosphere, ocean, and climate dynamics: an introductory text/editors John Marshall and R. Alan Plumb.)
Part 4: temperature change and CO$_2$ concentrations¶
Download the global average CO$_2$ concentration timeseries data in the CSV format (source: NOAA). Here, let me help your read them using pandas:
1 | df = pd.read_csv('co2_mm_gl.csv', skiprows=55, parse_dates={'date' : [0, 1]}, index_col='date') |
Prepare three plots:
- plot the monthly global CO$_2$ concentration as a function of time.
- plot the annual average timeseries of global CO$_2$ concentration as a function of time.
- plot the annual average timeseries of global CO$_2$ concentration and of global 2m temperature from ERA5 on the same plot (using a secondary y axis for temperature).
1 2 3 4 5 6 | df['average'].groupby(df.index.month).mean().plot() plt.ylabel('CO$_2$ concentration [ppm]') plt.xlabel('year') plt.grid() plt.xticks(ticks=[1,2,3,4,5,6,7,8,9,10,11,12], labels = ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']) plt.title('Monthly global CO$_2$ concentration'); |
1 2 3 4 | df['average'].groupby(df.index.year).mean().plot() plt.ylabel('CO$_2$ concentration [ppm]') plt.xlabel('year') plt.title('Annual global average CO$_2$ concentration'); |
1 2 3 4 5 6 7 8 | # Meridional weights weight = np.cos(np.deg2rad(ds.latitude)) weight = weight / weight.sum() # Meridionally weighted zonal mean zonal_mean_t2_c = ds.t2m.mean(dim='longitude') - 273.15 # convert into Celsius weighted_zonal_mean_t2_c = zonal_mean_t2_c * weight weighted_ts_t2_c = weighted_zonal_mean_t2_c.sum(dim='latitude') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | tsa_t2_c = weighted_ts_t2_c.resample(time='AS').mean() df1 = df['average'].groupby(df.index.year).mean().to_frame(); df2 = ds.t2m.to_dataframe(); df2 = tsa_t2_c; fig, ax = plt.subplots() plt.title('Annual global average CO$_2$ concentration compared to global 2m temperature') ax2 = ax.twinx() ax.plot(df1.index, df1["average"], color = 'blue') ax2.plot(df2["time.year"], df2, color = 'orange') ax.set_xlabel('year', color = 'black') ax.set_ylabel('CO$_2$ concentration [ppm]', color = 'blue') ax2.set_ylabel('2m temperature [°C]', color = 'orange'); |
Question:
- Describe and explain the annual cycle of CO$_2$ concentrations.
Answer:
The amount of CO$_2$ in the atmosphere fluctuates throughout the year as feedbacks occur between the terrestrial biosphere and the atmosphere. It is therefore dominated by the Northern Hemisphere, where more land, i.e. more plants are located. During the summer months, a variety of plants grow, thrive and fruit, often referred to as the "growing season." Due to photosynthetic activity, CO$_2$ concentration decreases from the beginning of June and reaches its lowest level in early August, the time when fruits are ripe and flowers are in full bloom. After that, the "vegetation dormancy" begins, during which the plants are photosynthetically inactive. CO$_2$ is released through cellular respiration, which causes the CO$_2$ content to increase, first slightly and then increasingly, in the fall and winter. In April and May, plants slowly begin to germinate. Cellular respiration and photosynthesis thus also balance each other out as opposing processes, which is why the CO$_2$ concentration remains largely as good as the same during this period. (sources: https://www.science-e-publishing.de/project/klimadebatte/002-kohlenstoffkreislauf.htm; https://www.dwd.de/DE/service/lexikon/Functions/glossar.html?nn=103346&lv2=102868&lv3=102894)
Question:
- What was the CO$_2$ concentration in the atmosphere in the pre-industrial era? Compute the annual increase in CO$_2$ concentration (unit: ppm per year) between 1980 and 1985 and between 2016 and 2021.
Answer:
Before the beginning of industrialization, the carbon dioxide content in the air was fairly stable for thousands of years. This relatively constant value is based on the balanced, natural carbon cycle. In general, the values of the pre-industrial CO2 mixing ratio, based on the analysis of ice cores, were in the range of 275-285 ppm. (source: https://wiki.bildungsserver.de/klimawandel/index.php/Kohlendioxid-Konzentration)
1 2 3 | years = df1.index[1:7] y_from, y_to = years.min(), years.max() print(f"The annual increase in carbon dioxid concentration between {y_from}-{y_to} in average is {round(df1['average'][1:7].diff().mean(), 4)} ppm/year.") |
The annual increase in carbon dioxid concentration between 1980-1985 in average is 1.3252 ppm/year.
1 2 3 | years = df1.index[-7:-1] y_from, y_to = years.min(), years.max() print(f"The annual increase in carbon dioxid concentration between {y_from}-{y_to} in average is {round(df1['average'][-7:-1].diff().mean(), 4)} ppm/year.") |
The annual increase in carbon dioxid concentration between 2016-2021 in average is 2.3297 ppm/year.
Question:
- Describe the relationship between global temperatures and CO$_2$ concentrations. Beside CO$_2$, name three processes that can influence temperature variability and change at the global scale.
Answer: The natural greenhouse effect is caused by water vapor and trace gases, especially CO$_2$. Without this effect, in which a part of the long-wave radiation is absorbed and the other part is radiated back towards the earth's surface as heat radiation, the global average temperature near the ground would only be -18°C instead of 15°C. Since the beginning of industrialization, the natural equilibrium has been disturbed by man-made greenhouse gases (anthropogenic greenhouse effect), with CO$_2$ concentrations continuing to rise. Therefore, the global temperature has increased by more than 1°C since then until today.
There are also several other factors that are blamed for the temperature fluctuations. The main reason for the succession of ice ages and warm periods is a constantly changing orbit of the earth around the sun over a period of thousands of years. But also variations in the intensity of solar radiation lead to cycles of rising and falling global temperatures, albeit already in the range of decades. In addition, the position of the continents influences the earth's climate in the long term. The increased continentality and the formation of a thick ice layer on a large land mass like Antarctica leads to a reduction of the global average temperature.
(sources: https://www.oekosystem-erde.de/html/klimageschichte.html#:~:text=Insgesamt%20wurde%20die%20Erde%20nach,2%2C6%20Millionen%20Jahren%20begannen; https://www.myclimate.org/de/informieren/faq/faq-detail/was-ist-der-treibhauseffekt/#:~:text=Der%20Treibhauseffekt%20ist%20grunds%C3%A4tzlich%20ein,von%20der%20kurzwelligen%; https://www.tessloff.com/was-ist-was/wissenschaft/klima/der-treibhauseffekt-einfach-erklaert.html)
Part 5: variability and ENSO (open research question)¶
Using the available data, describe the global effect of an El Niño year and a La Niña year on sea-surface temperature, precipitation, and air temperature. I 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. Then use annual or seasonal anomaly maps to show the patterns of SST, temperature and precipitation anomalies during these events. With citation or links, explain why you picked these years as examples.
chosen examples:
- normal situation: summer 1989/90
- El Nino event: summer 1997/98
- La Nina event: summer 1999/00 taken from Diercke World Atlas 2010, p.189
1 | ds3 = xr.open_dataset(r'./data/ERA5_LowRes_Monthly_sst.nc') |
sea surface temperature plots¶
1 2 3 4 | ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds3.sst.sel(time=slice('1989-10','1990-03')).mean(dim='time')-273.15).plot(ax=ax, transform=ccrs.PlateCarree(),vmin=0,vmax=35,levels=[0,5,10,15,20,25,28,30], cbar_kwargs={'label': 'sea surface temperature in °C'}) ax.coastlines(); ax.gridlines() ax.set_title('normal situation in summer 1989/90',fontsize=18); |
1 2 3 4 | ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds3.sst.sel(time=slice('1997-10','1998-03')).mean(dim='time')-273.15).plot(ax=ax, transform=ccrs.PlateCarree(),vmin=0,vmax=35,levels=[0,5,10,15,20,25,28,30], cbar_kwargs={'label': 'sea surface temperature in °C'}) ax.coastlines(); ax.gridlines() ax.set_title('El Nino event in summer 1997/98',fontsize=18); |
1 2 3 4 5 | #anomaly for el nino situation ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds3.sst.sel(time=slice('1997-10','1998-03')).mean(dim='time')-ds3.sst.mean(dim='time')).plot(ax=ax, transform=ccrs.PlateCarree(),vmin=-7,vmax=7, cmap='RdBu_r', cbar_kwargs={'label': 'sea surface temperature anomaly in °C'}) ax.coastlines(); ax.gridlines() ax.set_title('El Nino SST anomaly in summer 1997/98',fontsize=18); |
1 2 3 4 | ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds3.sst.sel(time=slice('1999-10','2000-03')).mean(dim='time')-273.15).plot(ax=ax, transform=ccrs.PlateCarree(),vmin=0,vmax=35,levels=[0,5,10,15,20,25,28,30], cbar_kwargs={'label': 'sea surface temperature in °C'}) ax.coastlines(); ax.gridlines() ax.set_title('La Nina event in summer 1999/2000',fontsize=18); |
1 2 3 4 5 | #anomaly for la nina situation ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds3.sst.sel(time=slice('1999-10','2000-03')).mean(dim='time')-ds3.sst.mean(dim='time')).plot(ax=ax, transform=ccrs.PlateCarree(),vmin=-7,vmax=7, cmap='RdBu_r', cbar_kwargs={'label': 'sea surface temperature anomaly in °C'}) ax.coastlines(); ax.gridlines() ax.set_title('La Nina SST anomaly in summer 1999/2000',fontsize=18); |
temperature plots¶
1 2 3 4 | ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds.t2m.sel(time=slice('1989-10','1990-03')).mean(dim='time')-273.15).plot(ax=ax, transform=ccrs.PlateCarree(),vmin=0,vmax=35,levels=[0,5,10,15,20,25,28,30], cbar_kwargs={'label': 'sea surface temperature in °C'}) ax.coastlines(); ax.gridlines() ax.set_title('normal situation in summer 1989/90',fontsize=18); |
1 2 3 4 | ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds.t2m.sel(time=slice('1997-10','1998-03')).mean(dim='time')-273.15).plot(ax=ax, transform=ccrs.PlateCarree(),vmin=0,vmax=35,levels=[0,5,10,15,20,25,28,30], cbar_kwargs={'label': '2 metre temperature in °C'}) ax.coastlines(); ax.gridlines() ax.set_title('El Nino event in summer 1997/98',fontsize=18); |
1 2 3 4 5 | #anomaly for el nino situation ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds.t2m.sel(time=slice('1997-10','1998-03')).mean(dim='time')-ds.t2m.mean(dim='time')).plot(ax=ax, transform=ccrs.PlateCarree(),vmin=-7,vmax=7, cmap='RdBu_r', cbar_kwargs={'label': '2 metre temperature anomaly in °C'}) ax.coastlines(); ax.gridlines() ax.set_title('El Nino temperature anomaly in summer 1997/98',fontsize=18); |
1 2 3 4 | ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds.t2m.sel(time=slice('1999-10','2000-03')).mean(dim='time')-273.15).plot(ax=ax, transform=ccrs.PlateCarree(),vmin=0,vmax=35,levels=[0,5,10,15,20,25,28,30], cbar_kwargs={'label': '2 metre temperature in °C'}) ax.coastlines(); ax.gridlines() ax.set_title('La Nina event in summer 1999/2000',fontsize=18); |
1 2 3 4 5 | #anomaly for la nina situation ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds.t2m.sel(time=slice('1999-10','2000-03')).mean(dim='time')-ds.t2m.mean(dim='time')).plot(ax=ax, transform=ccrs.PlateCarree(),vmin=-7,vmax=7, cmap='RdBu_r', cbar_kwargs={'label': '2 metre temperature anomaly in °C'}) ax.coastlines(); ax.gridlines() ax.set_title('La Nina Temperature anomaly in summer 1999/2000',fontsize=18); |
precipitation plots¶
1 2 3 4 | ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds1.tp.sel(time=slice('1989-10','1990-03')).mean(dim='time')*1000).plot(ax=ax, transform=ccrs.PlateCarree(), levels=[0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40], cmap='YlGnBu', cbar_kwargs={'label': 'precipitation in mm/d'}) ax.coastlines(); ax.gridlines() ax.set_title('normal situation in summer 1989/90',fontsize=18); |
1 2 3 4 | ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds1.tp.sel(time=slice('1997-10','1998-03')).mean(dim='time')*1000).plot(ax=ax, transform=ccrs.PlateCarree(), levels=[0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40], cmap='YlGnBu', cbar_kwargs={'label': 'precipitation in mm/d'}) ax.coastlines(); ax.gridlines() ax.set_title('El Nino event in summer 1997/98',fontsize=18); |
1 2 3 4 5 | #anomaly for el nino situation ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds1.tp.sel(time=slice('1997-10','1998-03')).mean(dim='time')*1000-ds1.tp.mean(dim='time')*1000).plot(ax=ax, transform=ccrs.PlateCarree(),vmin=-35,vmax=35, cmap='RdBu', cbar_kwargs={'label': 'precipitation anomaly in mm/d'}) ax.coastlines(); ax.gridlines() ax.set_title('El Nino precipitation anomaly in summer 1997/98',fontsize=18); |
1 2 3 4 | ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds1.tp.sel(time=slice('1999-10','2000-03')).mean(dim='time')*1000).plot(ax=ax, transform=ccrs.PlateCarree(), levels=[0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40], cmap='YlGnBu', cbar_kwargs={'label': 'precipitation in mm/d'}) ax.coastlines(); ax.gridlines() ax.set_title('La Nina event in summer 1999/2000',fontsize=18); |
1 2 3 4 5 | #anomaly for la nina situation ax = plt.axes(projection=ccrs.Robinson(central_longitude=-180)) (ds1.tp.sel(time=slice('1999-10','2000-03')).mean(dim='time')*1000-ds1.tp.mean(dim='time')*1000).plot(ax=ax, transform=ccrs.PlateCarree(),vmin=-35,vmax=35, cmap='RdBu', cbar_kwargs={'label': 'precipitation anomaly in mm/d'}) ax.coastlines(); ax.gridlines() ax.set_title('La Nina SST precipitation in summer 1999/2000',fontsize=18); |
Sea surface temperature (SST)
- El Nino: SST is warmer than average in the east pacific ocean around the equator, reaching from the strongest anomaly (up to 6°C) at the south american coast westwards to about 180° W
- La Nina: SST in the pacific ocean around the equator is colder than average, reaching negative anomalies up to about 3°C
2 metre temperature (T) precipitation (P)
- El Nino: warm T anomaly in the same region as with SST, but less strong (about 4°C at the south american coast, decreasing westwards
- La Nina: also closely coupled with SST, same but weaker cold anomaly (only 1-2°C)
- El Nino: slight shift of the ITCZ southwards onto the equator, leading to intensification in that region (about 20 mm/d more precipitation)
- La Nina: no shift of the ITCZ, but weakening of precipitation about 5-10 mm/d within it. no other significant anomalies visible