- Jan 2024
-
notebooksharing.space notebooksharing.space
-
v10_zonal.plot(label = 'zonal and temporal average 10m V wind component'); plt.axhline(0,color ='r',label='zero line'); plt.legend(); plt.ylabel('Windspeed in m/s'); plt.xlabel('Latitude in degrees north'); plt.title('zonal 10m V wind component vs zero line');
You call the "v" component meridional wind (not zonal), see e.g. https://en.wikipedia.org/wiki/Zonal_and_meridional_flow
If you wanted to be very exact, you would write as title: Zonal and temporal average 10 merigional wind (V-component)
-
Meridional winds (v wind) circulate from North to South or South to North, parallel to longitudes (Schönewiese, 2013, 163). Explanation: At -50deg we have a large u-wind, as there is only sea at this latitude, which is why the wind is mainly dominated by the Coriolis force and the wind is not deflected. At the equator, we have the trade winds that go from west to east. The wind comes from the high-pressure area near the equator and flows towards the equator into the low-pressure area, which is directed to the west by the Coriolis force. Closer to the poles are the westerlies, which are located at the Ferrel cell, and even closer to the poles we have easterlies again at the Polar cell (Lecture 1, p. 11). Zonal winds (u wind) circulate from West to East or West to East, parallel to latitudes (Schönewiese, 2013, 163) Explanation: North to south, the zeros are always the end or beginning of a cell. From about 0 to 30 degrees is the Hadley cell, from 30 to 60 degrees the Ferrel and then Polar cell. The winds always flow in the direction of the cells, e.g. between 0 and 30 degrees everything flows south to the ITCZ where the Hadley cell "ends" (Lecture 1, p. 11). Meridional winds generally have a weaker velocity than zonal winds. Strongest zonal winds can reach up to 30 m/s near 30◦ latitude in the winter hemisphere at 200 mbar. Mean merdional winds (northwards) habe a velocity < 1 m/s at 200 mbar. (Marshall un Plumb, 2008, p. 73 f.)
The answers are correct and good. However, I think the first part rather describes the zonal winds and the second part the meridional winds.
-
Equatorial low pressure belt also known as ICTZ around the equator: Explanation: Receives highest solar energy, which heats up the air temperature, leading to a decrease of pressure (NOAA 2023a) Subtropical high pressure belt at 30° N/S latitude for both hemispheres Explanation: Heated air coming from equator has cooled down and is sinking down (NOAA 2023a) Polar belt of low pressure belt at 60° N/S latitude for both hemispheres
Great! but it would be good to link the NOAA 2023a reference to a website (but this is a detail)
-
u10_avg = ds.u10.mean(dim='time') #mean over time u10_zonal = u10_avg.mean(dim='longitude') #mean over lon u10_zonal.plot(label = 'zonal and temporal average 10m U wind component'); plt.axhline(0,color ='r',label='zero line'); plt.legend(); plt.ylabel('Windspeed in m/s'); plt.xlabel('Latitude in degrees north'); plt.title('zonal 10m U wind component vs zero line');
Well done!
-
msl_avg = ds.msl.mean(dim='time') #mean over time msl_zonal = msl_avg.mean(dim='longitude')*10**(-2) #mean over lon and coversion into hPa msl_zonal.plot(label = 'zonal and temporal average sea-level pressure'); plt.axhline(1013.25,color ='r',label='standard atmosphere pressure'); plt.legend(); plt.ylabel('Pressure in hPa'); plt.xlabel('Latitude in degrees north'); plt.title('zonal sea level pressure vs standard atmosphere pressure');
Well done!
-
precip_davg_mmpd[7]
same here, to be sure that you select the right thing, it is best to directly select the month by doing:
`precip_davg_mmpd.sel(month=7)
-
precip_davg_mmpd[0]
This works and is correct, but it is easier and less error-prone if you directly select the month by doing:
`precip_davg_mmpd_jan = precip_davg_mmpd.sel(month=1)
-
(Lecture 1, p. 25
Great that you always give the references ;-)
-
In [8]: t2c_mavg_global= t2c_mavg.mean(dim='longitude').mean(dim='latitude') t2c_mavg_global.plot() plt.title(r'Monthly average temperature $\overline{T_M}$, ERA5 1979-2018'); plt.ylabel('t2m in °C');
We didn't ask for that plot, and there is one important problem here: you just average over the latitudes which creates a wrong weighting as there is much more area around the equatorial latitudes than around the poles !!! If you want to do global averages, you have to apply a weighted average!!!
-
ice covered
True, even more explicit would be: "seasonally land-ice covered"
-
ax = plt.axes(projection=ccrs.Robinson()) t2c_mrange.plot.imshow(ax=ax, transform=ccrs.PlateCarree(),cbar_kwargs={'label': '°C'}) ax.coastlines(); ax.gridlines() ax.set_title(r'$\overline{T_{M}}_{max}$ - $\overline{T_{M}}_{min}$, ERA5 1979-2018');
with the code above, you see that what you plot is basically sth. like the interannual variability and not the seasonal variablity (the seasonal variations are also much larger)
-
t2c_mmax= ds.t2m.groupby('time.month').max()-275 t2c_mmin= ds.t2m.groupby('time.month').min()-275 t2c_mrange = (t2c_mmax - t2c_mmin).mean(dim='month') t2c_mrange
Attention: Here, you used again the wrong Kelvin to celsius conversion. And, you computed for each month, the maximum and minimum temperature over the 40 year period. However, we wanted you to compute first the seasonal average, and then compute from those 12 avg. seasonal values the average:
``t2_cycle = ds.t2m.groupby('time.month').mean() - 273.15
ax = plt.axes(projection=ccrs.Robinson())
(t2_cycle.max(dim='month') - t2_cycle.min(dim='month')).plot(ax=ax, transform=ccrs.PlateCarree(), bar_kwargs={'label':'$\overline{T}$ [K]'})
ax.coastlines(); ax.gridlines(); ``
-
-275
ATTENTION -> here the conversion is wrong, it should have been 273.15
For these cases it is best to set a variable at the beginning of the notebook or to convert the data once at the beginning!!!
-
={'label': '°C'})
same here, write Temperature differences (°C) or $\overline{T^{*}}$ (°C)
-
1978-2008
1979-2018
-
vmin=-40, vmax=20, l
for temperatures I would rather always use the red/blue color scale (that is the default one if you do not show levels)
-
cbar_kwargs={'label':
would be nice to also have the variable and not just the unit e.g. just doing:
Temperature (°C) or call it as described in the exercise description, i.e., --> $\overline{T}$ (°C)
-
-
notebooksharing.space notebooksharing.space
-
# temporal and zonal average of U wind component #compute average u10_avg = ds3.u10.mean(dim=['time','longitude']) #create plot u10_avg.plot(label='10 meter u wind component') plt.axhline(0, color='black', label='horizontal line') plt.legend() plt.ylabel('wind speed [m/s]') plt.title('temporal and zonal average of 10 meter u wind component, ERA5 1979-2018');
Well done!
if you wanted to describe it more detailed you could write "zonal wind (u-component)"
Instead of writing horizontal line for the 0-line, you can write e.g. "no wind" or "zero wind speed"
-
In [31]: # temporal and zonal average of v wind component #compute average v10_avg = ds3.v10.mean(dim=['time','longitude']) #create plot v10_avg.plot(label='10 meter v wind component') plt.axhline(0, color='black', label='horizontal line') plt.legend() plt.ylabel('wind speed [m/s]') plt.title('temporal and zonal average of 10 meter v wind component, ERA5 1979-2018');
Well done, if you wanted to describe it more detailed you could write "meridional wind (v-component)"
-
In [29]: # temporal and zonal average of sea-level pressure #compute average msl_avg = ds3.msl.mean(dim=['time','longitude']) slp = msl_avg / 100 #convert to hpa std_p = 1013.25 #standard atmosphere pressure #create plot slp.plot(label='sea-level pressure') plt.axhline(std_p, color='black', label='standard atmosphere pressure') plt.legend() plt.ylabel('sea-level pressure [hpa]') plt.title('temporal and zonal average of sea-level pressure, ERA5 1979-2018');
Well done!
-
'Precipitation in mm'
Great, even better is if you write out that it is mm per day, e.g:
'Precipitation (mm per day)'
-
'Precipitation in mm'
Great, even better is if you write out that it is mm per day, e.g:
'Precipitation (mm per day)'
-
'label': 'Precipitation in mm'
Great, even better is if you write out that it is mm per day, e.g:
'Precipitation (mm per day)'
-
(I am not sur if this is a writing mistake in the task
as the pattern of the ICTZ is similar in January and February, we wrote both January and February ... but yes, the question was a bit misleading. Good that you checked both, January and February.
-
references: class slides of annuale climate patterns good short explanation: https://www.eskp.de/grundlagen/klimawandel/monsun-935719/ (29.12.2023, 9:03)
great that you give the references!
-
, https://www.ruseducation.in/climate-in-russia/#
ok for here as reference, but you would not be allowed to use these kind of websites for your bachelor thesis ...
-
In the North Atlantic we have a ocean circulation called the gulf stream, that transports warmer air from the Caribbean to northern Europe. This is warming the surface level air and causes the temperature difference with North America or Russia, where there is no such effect. In the Northern Pacific on the other hand cold water is transported northwards as we can see in this picture:
Yes! Correct.
-
In [7]: #plot temperature range ax = plt.axes(projection=ccrs.Robinson()) tavgerage_range.plot(ax=ax, transform=ccrs.PlateCarree(), levels=60, cbar_kwargs={'label': 'Range of average air temperature in °C'}) ax.coastlines(); ax.gridlines(); plt.title('Average monthly temperature range, ERA5 1979-2018');
Nice!
-
anomaly
Temperature anomaly in °C
-
vmin=-40, vmax=30, levels=30
The level labels are a bit strange, and I would recomment to change them to label more rounded values
-
='plasma',
for temperatures I would rather always use some red/blue color scale (that is the default one if you do not show levels)
e.g RdBU_r or coolwarm
-
center=False,
center = True makes more sense in this case
-
g-272.1
Attention: conversion factor is wrong here,
To make sure that these typos do not occur, it is best to set a variable at the beginning of the notebook or to convert the data once at the beginning, then you don't have to repeat it always!
-
Answers:
test
-
-
notebooksharing.space notebooksharing.spaceproject (1)11
-
On the plots the rainy seasons in a few countries in the asian region, the phenomenon is called monsoon.
you don't mention the months when the monsoon occurs.
-
In January it is closer southwards, in August it's more to the north.
mentioning the connection to heavy rainfall would have been good, in January the ICTZ is actually at the Equator or slightly southward, in August it is clearly to the north of the Equator.
-
In January it is closer southwards, in August it's more to the north. On the plots the rainy seasons in a few countries in the asian region, the phenomenon is called monsoon.
some references at the end would have been good
-
tp_m[1]
it is much clearer if you directly select the month, because otherwise you might accidentally select the wrong dimension, you can do that via e.g.:
tp_m.sel(month=1)
-
tp_m[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'})
"mm per day", or "precipitation (mm per day)" is much clearer than "mm"
-
t2_tavg.plot(ax=ax, transform=ccrs.PlateCarree(), center=False, vmin=-40, vmax=20, levels=7, cbar_kwargs={'label': 'degrees celsius'}) ax.set_title('Average 2m air temperature, ERA5 1979-2018') ax.coastlines(); ax.gridlines();
for temperatures I would rather always use the red/blue color scale (that is the default one if you do not show levels)
-
degrees celsiu
Temperature (°C) or call it as described in the exercise description, i.e., --> $\overline{T}$
-
The temperature range is largest over the the Himalayas because they are very high and therefore the pressure decreases leading to colder temperatures than the rest of the zonal average. (Also on the southpole there is a large temperature range but I don't know why.)
Attention, I think you are mixing the analysis of the zonal temperature differences with the seasonal temperature range:
You can find the region where the temperature range is largest by doing the plot of max_temp -min_temp. If you do that, you will see that the largest temperature range is in Russia and Arctic Canada, the reason is potentially that it is a land area that is very "continental" and it is at very high latitude which, as you said correctly in part 1, results in stronger solar insulation variability over the seasons ...
In the Himalayas, you see that the temperatures are lower than on longitudes of the same latitude as the gridpoints are at higher altitudes (but that has nothing to do with the temperature range)
-
Answers
Here it is nicer to create a list of the answers, as it is hard to read the answers in this block text. * 1. a) * 1. b)
....
-
Difference in degrees
Temperature difference (°C)
-
t_monthly = ds['t2m'].groupby('time.month').mean(dim='time')-273.15 max_temp = t_monthly.max() min_temp = t_monthly.min() plt.figure(figsize=(12, 24)) for i in range(1, 13): ax = plt.subplot(6, 2, i, projection=ccrs.PlateCarree()) t_monthly.sel(month=i).plot(ax=ax, transform=ccrs.PlateCarree(), add_colorbar=False, vmin=min_temp, vmax=max_temp, cmap='RdBu_r') ax.coastlines() ax.set_title('Month: {}'.format(i)) plt.tight_layout() plt.show()
you have only plotted the monthly average temperature (t_monthly). It is nice that you used the same color scale for every plot (which helps to compare the months), however, * a colorbar legend would have been nice * another additional plot would have been great that directly shows max_temp -min_temp.
Example code for that would be:
t2_cycle = ds.t2m.groupby('time.month').mean() - 273.15 ax = plt.axes(projection=ccrs.Robinson()) (t2_cycle.max(dim='month') - t2_cycle.min(dim='month')).plot(ax=ax, transform=ccrs.PlateCarree(), cbar_kwargs={'label':'$\overline{T}$ [K]'}) ax.coastlines(); ax.gridlines();
-
-
notebooksharing.space notebooksharing.space
-
West Africa experiences more precipitation in August than in June, this is called the West African Monsoon. This happens because the (ITCZ) shifts northward and brings heavy rains.
The monsoon season in West Africa is from ~June to ~September (and a similar period is true for the Indian Monsoon). This is not so clear from your answer.
-
In January, the Intertropical Convergence Zone (ITCZ) is generally situated near or over the equator. By August, it tends to shift northward, reaching a position closer to the northern hemisphere, due to the seasonal movement of the sun. (We assume you have a typo in your question and meant January and Agust because of the plots) West Africa experiences more precipitation in August than in June, this is called the West African Monsoon. This happens because the (ITCZ) shifts northward and brings heavy rains. In India it's a similar pattern and is known as Indian Monsoon.
It is nice that you added links, but a real reference after every answer would have been better, sth. like:
([ REF ] ( REF ))
-
In January, the Intertropical Convergence Zone (ITCZ) is generally situated near or over the equator. By August, it tends to shift northward, reaching a position closer to the northern hemisphere, due to the seasonal movement of the sun. (We assume you have a typo in your question and meant January and Agust because of the plots)
We meant January and February but we agree that it was confusing. It would have been good if you'd mentioned the connection of the ICTZ to the rainy season.
-
('Precipitation in mm/day'
Great that you do the labelling and that you added both variable and unit!
-
ax.contourf(ds['longitude'],ds['latitude'],average_prec_in_mm_grouped[1], transform=ccrs.PlateC
Same as in the figures from Ex. 1, it is in that case better to not use contourf, and to use:
`pm = average_prec_in_mm.sel(month=1)
ax = plt.axes(projection=ccrs.Robinson())
pm.plot(ax=ax, transform=ccrs.PlateCarree(), cbar_kwargs={'label':'mm d$^{-1}$'}, levels=[0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40], cmap='YlGnBu') `
The contourf approach does not scale the levels accordingly. As you can see, you can not distinguish the regions with e.g. 1 mm per day to the regions with 4 mm per day. WIth the code above the colors change linearly with the given levels, and that allows to better distinguish between the levels.
-
average_prec_in_mm_grouped[8]
better to do:
average_prec_in_mm.sel(month=8)
-
average_prec_in_mm_grouped[1]
better to do:
average_prec_in_mm.sel(month=1)
-
average_prec_in_mm_grouped = average_prec_in_mm.groupby('month')
You don't have to do this step. It is much easier and less error-prone if you just do the following to select a specific month:
average_prec_in_mm.sel(month=1)
average_prec_in_mm.sel(month=8)
-
temp_range = (ds['t2m'].groupby('time.month').max()-ds['t2m'].groupby('time.month').min()).mean('month') contour = ax.contourf(ds['longitude'], ds['latitude'], temp_range, transform=ccrs.PlateCarree()) gl = ax.gridlines(draw_labels=True) cbar = plt.colorbar(contour, ax=ax) cbar.set_label('Temperature in °C') ax.set_title('Average monthly temperature range') plt.show()
Attention, what you compute here is not what was asked for! You compute the maximum/minimum over the years, so what is represented here is basically the maximum interannual variability and not the seasonal temperature range
However, we wanted you to compute first the seasonal average, and then compute from those 12 avg. seasonal values the average:
``t2_cycle = ds.t2m.groupby('time.month').mean() - 273.15
ax = plt.axes(projection=ccrs.Robinson())
(t2_cycle.max(dim='month') - t2_cycle.min(dim='month')).plot(ax=ax, transform=ccrs.PlateCarree(), bar_kwargs={'label':'$\overline{T}$ [K]'})
ax.coastlines(); ax.gridlines(); ``
-
y = month_aver_temp.mean('longitude').mean('latitude')-273.15
We did not ask for that plot, but Attention, you are not allowed to do the simple average over the latitude!!! You need to do a weighted average over the latitudes!!!
-
l('Mean Temperature in °C')
even clearer would be if you write: Temperature anomaly (in °C)
-
zonal_anomaly = ds['t2m'].mean(dim='time') - ds['t2m'].mean(dim=['time', 'longitude']) fig = plt.figure() ax = plt.axes(projection=ccrs.Robinson()) ax.coastlines(linewidth=0.8) ax.add_feature(cfeature.BORDERS, linewidth=0.5, edgecolor='black',linestyle=':' ) levels = np.arange(zonal_anomaly.min().round()-1,zonal_anomaly.max().round()+2,2) contour = ax.contourf(ds['longitude'], ds['latitude'], zonal_anomaly, transform=ccrs.PlateCarree(),levels = levels) gl = ax.gridlines(draw_labels=True) cbar = plt.colorbar(contour, ax=ax) cbar.set_label('Mean Temperature in °C') ax.set_title('Zonal temperature anomaly') plt.show()
here the contourf appraoch works ok, however, it would be better to use here a colorscale that is divergent such as cmap =
RdBu_r
or cmap = 'coolwarm`A very simple approach would be just to show sth. like that: ` 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())
ax.coastlines(); ax.gridlines(); ``
-
fig = plt.figure() ax = plt.axes(projection=ccrs.Robinson()) ax.coastlines(linewidth=0.8) ax.add_feature(cfeature.BORDERS, linewidth=0.5, edgecolor='black',linestyle=':' ) temp_mean_C = ds['t2m'].mean(dim = 'time').values-273.15 contour = ax.contourf(ds['longitude'], ds['latitude'], temp_mean_C, transform=ccrs.PlateCarree()) gl = ax.gridlines(draw_labels=True) cbar = plt.colorbar(contour, ax=ax) cbar.set_label('Temperature in °C') ax.set_title('Temporal mean Temperature') plt.show()
nice annotations, but I would personally use another colorscale (e.g.cmap = 'coolwarm'), also it is more difficutl to recognize the patterns if you use the contour plot with just a few temperature levels. Better is to use in that case a continuos scale, e.g:
`` ax = plt.axes(projection=ccrs.Robinson())
t2_tavg.plot(ax=ax, transform=ccrs.PlateCarree(), cbar_kwargs={'label':'$\overline{T}$ [K]'})
ax.coastlines(); ax.gridlines(); `
-
e Kurohio cu
it is nice that you added a link, but the reference does not tell the reader anything about the Kuroshio current, but about ecological zooplankton near to this current ;-)
-
-
notebooksharing.space notebooksharing.space
-
summer months
you should clarify what you mean with summer months (of which hermisphere)!!! it is here sth. like June-September
-
The ITCZ extends in the south of the äquator during Jannuary and February becaus of the tilt of the earth. It moves abou 40° of latitude between summer and winter. (keep in mind the ocean heats more slowly. delay.)
conncetion of ITCZ to precipitation is missing, in January and February as you can see in your plot, the ITCZ is also often just at the equator, so it is both at the equator or slightly southward.
-
The ITCZ extends in the south of the äquator during Jannuary and February becaus of the tilt of the earth. It moves abou 40° of latitude between summer and winter. (keep in mind the ocean heats more slowly. delay.) Its due to the movemend of the ITCZ. Rainy season in west africa and India is in the summer months and is called monsoon. Warm water in the ocean evaporats and gets advected over land.
references are missing, they should be at the end
... (REF)
-
subplot_kw={'projection':ccrs.PlateCarree()})
it is bit nicer if you plot them using e.g. the Robinson projection:
projection=ccrs.Robinson()
-
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12,10), subplot_kw={'projection':ccrs.PlateCarree()}) # Plot average daily precipitation for January month = 1 monthly_precip.sel(month=month).plot(ax=ax1, levels=levels, cmap=cmap, transform=ccrs.PlateCarree()) ax1.add_feature(cfeature.COASTLINE) gridlines = ax1.gridlines(draw_labels=True) gridlines.bottom_labels = False gridlines.right_labels = False ax1.set_title(f'Average Daily Precipitation in {month_dict[month]}', rotation=90, x=-0.1, y=0) # Plot average daily precipitation for August month = 8 monthly_precip.sel(month=month).plot(ax=ax2, levels=levels, cmap=cmap, transform=ccrs.PlateCarree()) ax2.add_feature(cfeature.COASTLINE) gridlines = ax2.gridlines(draw_labels=True) gridlines.top_labels = False gridlines.right_labels = False ax2.set_title(f'Average Daily Precipitation in {month_dict[month]}', rotation=90, x=-0.1, y=0)
labels are missing, sth. like: precipitation (mm per day)
It is a bit nicer to have the title on top of the figure instead of on the left side.
-
# Plot montly average temperature (annual cycle) T_M.mean(dim=['longitude', 'latitude']).plot(figsize=[12,5]) plt.title('Annual cycle of mean temperature') plt.show()
We did not ask for that plot, but Attention, you are not allowed to do the simple average over the latitude!!! You need to do a weighted average over the latitudes!!!
-
e Continental Climate. A
this reference is a bit strange to link to (better than no reference though ;-) )
-
The temperature difference can be attributed to the ocean currents: In the Atlantic, the Gulf Stream brings warm waters from the tropics to the North Atlantic. While there are also warm ocean currents in the Pacific, like the Kuro Shio current, their impact on Alska, Canada, and Russia is not as pronounced due to different current patterns. The temperature range varies due to several factors: The temperature range in the tropics is smaller than in higher latitudes due to more constant solar radiation throughout the year. The temperature range is smaller over oceans than over land because water has a higher specific heat capacity than land, meaning it takes more energy to change the temperature of water compared to land. As a result, ocean temperatures tend to vary less than land temperatures. The temperature range is largest in the heart of Siberia, this is due to the Continental Climate. As we already learned, the heat capacity of land is low, which means it heats up a lot during the summer months and cools a lot throughout the Arctic winter.
it is nice to have the references linked, but it is better to clarify that the links actually represent the references (i.e., better to write at the end ref ...
Some of your answers are a bit on the very short side.
-
(cmap='Reds')
It is very hard to read the temperature range from that map, specifically because you also don't show the coastlines!
-
# Plot the temporal mean temperature T_mean.plot() plt.title('Temporal Mean Temperature') plt.show() # Plot the zonal anomaly map of average temperature T_star.plot() plt.title('Zonal Anomaly Map of Average Temperature') plt.show() # Plot montly average temperature (annual cycle) T_M.mean(dim=['longitude', 'latitude']).plot(figsize=[12,5]) plt.title('Annual cycle of mean temperature') plt.show() levels = np.linspace(0,60,11) cmap = 'YlGnBu' # Plot the average monthly temperature range T_M_range.plot(cmap='Reds') plt.title('Average Monthly Temperature Range') plt.show()
for all plots the labels are missing. It would be good to always have a label on the colorbar describing the variable and the unit
-
T_mean.plot() plt.title('Temporal Mean Temperature') plt.show() # Plot the zonal anomaly map of average temperature T_star.plot() plt.title('Zonal Anomaly Map of Average Temperature') plt.show() # Plot montly average temperature (annual cycle) T_M.mean(dim=['longitude', 'latitude']).plot(figsize=[12,5]) plt.title('Annual cycle of mean temperature') plt.show()
it is a bit nicer if you plot the maps in a transformed way using the ccrs.Robinson projection:
ax = plt.axes(projection=ccrs.Robinson())
T_mean.plot(ax=ax, transform=ccrs.PlateCarree(), cbar_kwargs={'label':'$\overline{T}$ [K]'})
`
It is also nice if you add the coastlines and gridlines:
ax.coastlines(); ax.gridlines();
-
ds = xr.open_dataset('ERA5_LowRes_Monthly_t2m.nc') - 273.15 # convert to °C
good idea to drectly convert the variables, an other alternative would be to create a new variable:
ds['t2m_degC'] = ds.t2m - 273.15
This ensures that you always remember that the unit is already °C. But in this case, where the dataset has just one variable it is ok as you did it.
-
-
notebooksharing.space notebooksharing.spaceproject_R_W10
-
In January and February, the [Intertropical Convergence Zone (ITCZ)](https://www.dwd.de/DE/service/lexikon/Functions/glossar.html?lv3=101278&lv2=101224#:~:text=F%C3%BCr%20ITCZ%20(englisch%3A%20Inter%2D,und%20kurze%20tropischen%20Gewitterst%C3%BCrme%20abwechseln.) generally lies near or slightly south of the equator, with the tilt of the Earth playing a role, especially in the Southern Hemisphere.
maybe would have been good to mention here that the ITCZ follows the mighartion of the SUN's position, and that is the reason why is is at the equator or slightly south to it.
Also would be good to mention that it leads to heavy rain .
-
In January and February, the [Intertropical Convergence Zone (ITCZ)](https://www.dwd.de/DE/service/lexikon/Functions/glossar.html?lv3=101278&lv2=101224#:~:text=F%C3%BCr%20ITCZ%20(englisch%3A%20Inter%2D,und%20kurze%20tropischen%20Gewitterst%C3%BCrme%20abwechseln.) generally lies near or slightly south of the equator, with the tilt of the Earth playing a role, especially in the Southern Hemisphere. In West Africa, there's a distinct wet season (June to September) and dry season. The West African Monsoon is the driving phenomenon. In India, the Indian Monsoon brings the majority of rainfall from June to September, with a secondary contribution from the northeast monsoon (October to December).
for both questions, the references are missing, it is nice to have some links, but the actual references should be at the end of the text.
e.g. ... ( REF )
-
ax1.set_title(f'average daily precipitation in {month_dict[month]}', rotation=90, x=-0.1, y=0)
It is a bit nicer to have the title on top of the figure instead of on the left side.
-
'projection':ccrs.PlateCarree()
it is bit nicer if you plot them using e.g. the Robinson projection:
projection=ccrs.Robinson()
-
).plot(ax=ax1, levels=levels, cmap=cmap, transform=ccrs.PlateCarree())
the colorbar labels are there, but it would be better to include
mm per day
-
ds_prec['tp'].attrs['units'] = 'mm'
Great that you correct the units, best is to then even write :
mm per day
Then, it is even clearer!
-
In [3]: # Compute the temporal mean temperature T_mean = ds['mean_temp'].mean(dim='time') # Plot the temporal mean temperature T_mean.plot() plt.title('temporal mean temperature') plt.show() # Compute the zonal anomaly map of average temperature T_anomaly = ds['mean_temp'].mean(dim='time') - ds['mean_temp'].mean(dim=['time', 'longitude']) # Plot the zonal anomaly map of average temperature T_anomaly.plot() plt.title('zonal anomaly map of average temperature') plt.show() # Compute the monthly average temperature for each month T_m = ds['mean_temp'].groupby('time.month').mean(dim='time')
labels for the colorbar are missing, it is a bit nicer if you plot the maps in a transformed way using the ccrs.Robinson projection:
ax = plt.axes(projection=ccrs.Robinson())
T_mean.plot(ax=ax, transform=ccrs.PlateCarree(), cbar_kwargs={'label':'$\overline{T}$ [K]'}) `
It is also nice if you add the coastlines and gridlines:
ax.coastlines(); ax.gridlines();
-
T_m.mean(dim=['longitude', 'latitude']).plot(ax=ax) ax.set_title('annual cycle') ax.set_xlabel('month') ax.set_ylabel('average temperature(°C)')
Attention: We did not ask for that plot, but Attention, you are not allowed to do the simple average over the latitude!!! You need to do a weighted average over the latitudes!!!
-
T_m_range.plot(cmap='coolwarm')
as here we talk about a range, it does not make sense to use a divergent colormap, but instead rather something continuous, such as cmap = 'viridis'
-
Ocean currents: The presence of the Gulf Stream in the North Atlantic plays a crucial role. The Gulf Stream carries warm water from the tropics towards higher latitudes, particularly affecting the western coast of Europe. This warm ocean current helps moderate temperatures in Northern Europe. While the Gulf Stream transports warm waters into the North Atlantic, the North Pacific lacks an equivalent strong, warm ocean current reaching high latitudes. The Kuroshio Current in the North Pacific, although warm, tends to move along lower latitudes and has less influence on the temperature at higher northern latitudes compared to the Gulf Stream. Average Monthly Temperature Range Map: Solar insolation: The tropics receive relatively consistent and high solar insolation throughout the year. The sun is nearly overhead, leading to consistent day length and more uniform heating. High Humidity: Tropical regions often have high humidity levels. Water vapor acts as a greenhouse gas, trapping heat and reducing temperature extremes. High specific heat of water: Water has a higher specific heat capacity than land. Oceans can absorb and store large amounts of heat without a significant increase in temperature. This moderating effect results in smaller temperature ranges over oceans. The temperature range is largest in [Sibirea](https://en.wikipedia.org/wiki/Siberia#:~:text=By%20far%20the%20most%20commonly,average%20about%2010%20%C2%B0C%20(), the combination of a continental climate, distance from oceans, low specific heat of land, Arctic influences, snow cover, and the region's latitude collectively result in the large temperature range observed in Siberia.
Well done, answers were written in a nice format and are well to the point! THe only thing that you could change is to mention at the beginning that the references are always given in the links.
-
-
notebooksharing.space notebooksharing.space
-
In August there's the rainy time in India and West Africa. In India the phenomenon is called Monsoon, which lasts fron June to September. On the other hand, the rain season in West Africa lasts longer, namely from May to September.
The wet season is in ~June to September/October for both West Africa and India, in both cases it is called monsoon.
-
er.
reference would be good
-
ry.
reference would be good
-
avg_prep_dm = dp.tp.groupby('time.month') ## Conversion to mm avg_prep_dm = avg_prep_dm.mean() / 1e-3 avg_prep_jan = avg_prep_dm.sel(month=1) levels = [0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40] ax = plt.axes(projection=ccrs.Robinson()) avg_prep_jan.plot(ax=ax, transform=ccrs.PlateCarree(), levels=levels, cmap='YlGnBu', cbar_kwargs={'label': 'mm per day'}) ax.coastlines(); ax.gridlines() ax.set_title('Average daily precipitation in January');
Great!
-
The temperature range is at its largest in The Northern Hemisphere over land and at the North pole. This is a direct consequence of the facts stated above: higher latitudes recieve solar radiation at different angles and at different intensities over the year and the Northern Hemisphere has more land than the Southern Hemisphere (land has much less heat capacity than oceans).
partly true, but actually the region with the largest temperature range is Sibiria (and NOT over the north pole)--> but you did the wrong computation from which you concluded that information. By checking some references you would have maybe recognized your computation error yourself.
-
Northern Europe and the North Atlantic region is significantly warmer than the same latitudes in North America or Russia due to the thermohaline circulation, which brings heat from the equatorial region of the gulf of mexico through oceanic currents. This circulation is formed by deep-ocean currents that are driven by differences in the water's density, which is controlled by temperature (thermo) and salinity (haline). The Northern pacific ocean does not have a similar pattern because the deep water currents flowing there are mainly cold. 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. The temperature range is smaller in the tropics than at higher latitudes because tropical regions recieve perpendicular solar energy at noon almost constantly throughout the year, meaning that seasonal changes are less pronounced than higher latitudes. The temperature range is also smaller over oceans than over land because oceans can retain heat better than land, releasing it during cold periods. In other words oceans have higher heat capacity, keeping their temperature within a certain range. The temperature range is at its largest in The Northern Hemisphere over land and at the North pole. This is a direct consequence of the facts stated above: higher latitudes recieve solar radiation at different angles and at different intensities over the year and the Northern Hemisphere has more land than the Southern Hemisphere (land has much less heat capacity than oceans).
references are missing
-
# average monthly temperature range trange = ds.t2m.groupby('time.month').max() - ds.t2m.groupby('time.month').min() plt.figure(figsize=(10, 6)) plt.pcolormesh(longitude, latitude, trange.values[0, :, :], cmap='viridis') plt.title('Temperature range') plt.xlabel('Longitude') plt.ylabel('Latitude') plt.colorbar(label='Temperature (°C)') plt.show();
this here does not represent the temperature range, but represent the interannual variability and then you selected the first month and show the interannual variability of that first month ...
You would have needed to do the following:
``` t2_cycle = ds.t2m.groupby('time.month').mean() - 273.15
ax = plt.axes(projection=ccrs.Robinson()) (t2_cycle.max(dim='month') - t2_cycle.min(dim='month')).plot(ax=ax, transform=ccrs.PlateCarree(), cbar_kwargs={'label':'$\overline{T}$ [K]'})
ax.coastlines(); ax.gridlines(); ``
-
tm = ds.t2m.groupby('time.month').mean() - 273.15
what you are doing here is to do get seasonal estimates over every gridpoint. But now you still have a dataset of 12 months times the gridpoints !!! What you are plotting further below is just the firs month (because you seleted the variable 0 !!!
-
#monthly average temperature tm = ds.t2m.groupby('time.month').mean() - 273.15 latitude = ds['latitude'].values longitude = ds['longitude'].values # Plotting the monthly average temperature as a heatmap plt.figure(figsize=(10, 6)) plt.pcolormesh(longitude, latitude, tm.values[0, :, :], cmap='viridis') plt.title('Monthly Average 2m Temperature') plt.xlabel('Longitude') plt.ylabel('Latitude') plt.colorbar(label='Temperature (°C)') plt.show();
the representation here is not so nice as the other ones above, because the projection is strange, there is no coastline ...
-
={'label': '°C'})
variable name is missing better would be :
Temperature anomaly (°C)
-
={'label': '°C'})
variable name is missing, better would be: Temperature (°C) (but this is a detail)
-
-
notebooksharing.space notebooksharing.space
-
s.
best is to give the reference here at the end
-
n.
better to add the reference at the end (though it is nice to have the links to the website as you did :-))
-
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())
it would be nice if you update the colorbar label, e.g.:
`cbar_kwargs={'label': 'Precipitation (mm per day)'}
-
<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.
wrong format!!!
-
<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.
this is not markdown format
-
cmap='Greens
the green cmap is a bit strange for temperature, I would rather use sth. continuous like viridis (but maybe personal taste)
-
# 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')
Attention, this is wrong!!! you computed for each month, the maximum and minimum temperature over the 40 year period. However, we wanted you to compute first the seasonal average, and then compute from those 12 avg. seasonal values the average:
``t2_cycle = ds.t2m.groupby('time.month').mean() - 273.15
ax = plt.axes(projection=ccrs.Robinson())
(t2_cycle.max(dim='month') - t2_cycle.min(dim='month')).plot(ax=ax, transform=ccrs.PlateCarree(), bar_kwargs={'label':'$\overline{T}$ [K]'})
ax.coastlines(); ax.gridlines(); ``
-
monthly_mean.mean(dim=['longitude', 'latitude']).plot(ax=ax)
ATTENTION: this is wrong! We did not ask for that plot, but Attention, you are not allowed to do the simple average over the latitude!!! You need to do a weighted average over the latitudes!!!
-
t2_tavg_dep.plot.imshow(ax=ax, transform=ccrs.PlateCarree(), levels=[-40, -25, -10, 0, 5, 10, 15, 20, 30, 40], cmap='coolwarm')
would be nice to also have a colorbar label that describes the variable and its unit sth, like: Temperature anomaly (°C)
-
t2_tavg_celsius.plot(ax=ax, transform=ccrs.PlateCarree(), levels=[-40, -25, -10, 0, 5, 10, 15, 20, 30, 40], cmap='coolwarm')
would be nice to also have a colorbar label that describes the variable and its unit
-
n a map. In [27]: # Convert Kelvin to Celsius ds_temp['t2m_celsius'] = ds_temp['t2m'] - 273.15
Nice idea to converr the variable directly into ° celsius
-