Supporting Information

Favorable winds speed up bird migration in spring but not in autumn

Raphaël Nussbaumer1,*, Baptiste Schmid2 , Silke Bauer2 and Felix Liechti2
1Cornell Lab of Ornithology, Cornell University, Ithaca, NY, USA
2 Swiss Ornithological Institute, Sempach, Switzerland
* Correspondence: ryn5@cornell.edu
Table of Contents

Data

Colorscale

Use Crameri perceptually uniform scientific colormaps
if exist('crameri')
set(0,'DefaultFigureColormap',crameri('batlow'));
else
set(0,'DefaultFigureColormap',[0.0052,0.0982,0.3498;0.0091,0.1045,0.3509;0.0130,0.1108,0.3520;0.0165,0.1169,0.3531;0.0199,0.1230,0.3541;0.0232,0.1290,0.3552;0.0263,0.1350,0.3562;0.0292,0.1410,0.3572;0.0321,0.1468,0.3582;0.0349,0.1526,0.3592;0.0374,0.1583,0.3602;0.0398,0.1640,0.3612;0.0421,0.1696,0.3622;0.0441,0.1751,0.3631;0.0459,0.1805,0.3640;0.0477,0.1858,0.3649;0.0494,0.1911,0.3658;0.0508,0.1963,0.3667;0.0522,0.2013,0.3675;0.0535,0.2064,0.3684;0.0547,0.2112,0.3692;0.0559,0.2160,0.3700;0.0570,0.2208,0.3707;0.0580,0.2253,0.3715;0.0592,0.2298,0.3723;0.0602,0.2343,0.3730;0.0611,0.2386,0.3737;0.0621,0.2429,0.3744;0.0631,0.2471,0.3750;0.0640,0.2512,0.3757;0.0649,0.2553,0.3764;0.0659,0.2593,0.3770;0.0669,0.2632,0.3776;0.0679,0.2671,0.3782;0.0690,0.2709,0.3788;0.0700,0.2747,0.3793;0.0711,0.2785,0.3799;0.0722,0.2822,0.3804;0.0734,0.2859,0.3810;0.0746,0.2897,0.3815;0.0758,0.2933,0.3819;0.0771,0.2970,0.3824;0.0785,0.3006,0.3828;0.0800,0.3043,0.3832;0.0816,0.3079,0.3836;0.0831,0.3115,0.3839;0.0848,0.3150,0.3842;0.0865,0.3186,0.3845;0.0884,0.3222,0.3847;0.0903,0.3257,0.3849;0.0923,0.3292,0.3850;0.0945,0.3327,0.3851;0.0966,0.3362,0.3851;0.0990,0.3396,0.3851;0.1015,0.3430,0.3850;0.1041,0.3464,0.3848;0.1068,0.3498,0.3845;0.1097,0.3531,0.3842;0.1127,0.3564,0.3838;0.1157,0.3596,0.3833;0.1190,0.3628,0.3827;0.1223,0.3660,0.3820;0.1259,0.3692,0.3813;0.1295,0.3722,0.3804;0.1333,0.3753,0.3794;0.1372,0.3783,0.3783;0.1413,0.3812,0.3771;0.1454,0.3841,0.3758;0.1497,0.3870,0.3744;0.1541,0.3898,0.3729;0.1586,0.3925,0.3713;0.1632,0.3952,0.3696;0.1680,0.3979,0.3678;0.1728,0.4005,0.3659;0.1778,0.4030,0.3638;0.1827,0.4056,0.3617;0.1879,0.4080,0.3595;0.1931,0.4104,0.3572;0.1983,0.4128,0.3548;0.2037,0.4151,0.3523;0.2091,0.4174,0.3497;0.2146,0.4197,0.3470;0.2201,0.4219,0.3443;0.2257,0.4240,0.3415;0.2314,0.4262,0.3386;0.2371,0.4283,0.3356;0.2428,0.4304,0.3326;0.2486,0.4325,0.3296;0.2545,0.4345,0.3264;0.2603,0.4366,0.3233;0.2662,0.4386,0.3201;0.2722,0.4405,0.3168;0.2782,0.4425,0.3136;0.2842,0.4445,0.3102;0.2902,0.4464,0.3069;0.2963,0.4484,0.3035;0.3024,0.4503,0.3001;0.3085,0.4522,0.2967;0.3146,0.4541,0.2933;0.3208,0.4560,0.2898;0.3270,0.4579,0.2864;0.3332,0.4598,0.2829;0.3395,0.4617,0.2795;0.3457,0.4636,0.2760;0.3520,0.4654,0.2725;0.3583,0.4673,0.2690;0.3646,0.4692,0.2655;0.3709,0.4711,0.2621;0.3773,0.4730,0.2586;0.3837,0.4748,0.2551;0.3901,0.4767,0.2517;0.3965,0.4786,0.2482;0.4030,0.4805,0.2447;0.4095,0.4824,0.2413;0.4160,0.4842,0.2379;0.4225,0.4861,0.2345;0.4291,0.4880,0.2311;0.4357,0.4899,0.2277;0.4424,0.4918,0.2244;0.4491,0.4937,0.2211;0.4558,0.4956,0.2178;0.4625,0.4975,0.2145;0.4694,0.4994,0.2113;0.4762,0.5013,0.2081;0.4831,0.5032,0.2050;0.4901,0.5051,0.2020;0.4971,0.5071,0.1990;0.5042,0.5090,0.1961;0.5113,0.5109,0.1933;0.5184,0.5128,0.1906;0.5256,0.5147,0.1880;0.5329,0.5167,0.1855;0.5402,0.5186,0.1831;0.5476,0.5205,0.1809;0.5550,0.5224,0.1789;0.5625,0.5243,0.1770;0.5700,0.5262,0.1753;0.5776,0.5281,0.1738;0.5852,0.5299,0.1725;0.5928,0.5318,0.1714;0.6005,0.5336,0.1706;0.6082,0.5354,0.1701;0.6160,0.5372,0.1698;0.6237,0.5390,0.1698;0.6315,0.5408,0.1701;0.6393,0.5425,0.1706;0.6471,0.5442,0.1715;0.6549,0.5459,0.1726;0.6627,0.5475,0.1740;0.6705,0.5491,0.1757;0.6782,0.5507,0.1778;0.6860,0.5523,0.1801;0.6937,0.5538,0.1826;0.7014,0.5553,0.1855;0.7091,0.5568,0.1885;0.7167,0.5582,0.1919;0.7243,0.5596,0.1954;0.7319,0.5610,0.1992;0.7394,0.5624,0.2032;0.7469,0.5637,0.2074;0.7543,0.5650,0.2118;0.7616,0.5663,0.2163;0.7689,0.5676,0.2210;0.7762,0.5689,0.2259;0.7834,0.5702,0.2310;0.7906,0.5714,0.2362;0.7977,0.5727,0.2415;0.8047,0.5739,0.2470;0.8117,0.5752,0.2526;0.8186,0.5765,0.2583;0.8255,0.5777,0.2642;0.8323,0.5790,0.2702;0.8390,0.5803,0.2764;0.8457,0.5817,0.2826;0.8522,0.5830,0.2890;0.8587,0.5844,0.2956;0.8652,0.5859,0.3023;0.8715,0.5874,0.3091;0.8777,0.5889,0.3161;0.8839,0.5904,0.3232;0.8899,0.5921,0.3305;0.8958,0.5938,0.3379;0.9016,0.5955,0.3454;0.9072,0.5973,0.3531;0.9127,0.5992,0.3610;0.9181,0.6011,0.3690;0.9233,0.6031,0.3771;0.9283,0.6052,0.3854;0.9332,0.6074,0.3938;0.9378,0.6096,0.4023;0.9423,0.6119,0.4110;0.9466,0.6142,0.4198;0.9507,0.6166,0.4286;0.9546,0.6191,0.4376;0.9582,0.6217,0.4466;0.9617,0.6243,0.4557;0.9649,0.6269,0.4649;0.9680,0.6296,0.4741;0.9708,0.6324,0.4833;0.9734,0.6352,0.4925;0.9758,0.6380,0.5018;0.9781,0.6409,0.5111;0.9801,0.6438,0.5203;0.9819,0.6467,0.5296;0.9836,0.6496,0.5388;0.9851,0.6525,0.5480;0.9864,0.6555,0.5571;0.9876,0.6584,0.5662;0.9886,0.6614,0.5753;0.9895,0.6643,0.5842;0.9903,0.6673,0.5932;0.9909,0.6702,0.6020;0.9915,0.6732,0.6108;0.9919,0.6761,0.6196;0.9923,0.6790,0.6283;0.9926,0.6819,0.6369;0.9928,0.6848,0.6454;0.9930,0.6877,0.6539;0.9931,0.6906,0.6624;0.9931,0.6935,0.6708;0.9931,0.6963,0.6792;0.9931,0.6992,0.6875;0.9930,0.7020,0.6958;0.9929,0.7049,0.7041;0.9928,0.7077,0.7124;0.9926,0.7105,0.7206;0.9924,0.7134,0.7289;0.9923,0.7162,0.7371;0.9921,0.7190,0.7454;0.9918,0.7219,0.7537;0.9916,0.7248,0.7620;0.9914,0.7276,0.7703;0.9911,0.7305,0.7786;0.9909,0.7334,0.7870;0.9906,0.7363,0.7954;0.9903,0.7392,0.8038;0.9900,0.7421,0.8123;0.9897,0.7450,0.8208;0.9894,0.7480,0.8294;0.9891,0.7510,0.8380;0.9888,0.7539,0.8466;0.9884,0.7569,0.8553;0.9880,0.7600,0.8641;0.9877,0.7630,0.8729;0.9873,0.7660,0.8817;0.9869,0.7691,0.8906;0.9864,0.7722,0.8995;0.9860,0.7753,0.9084;0.9855,0.7784,0.9174;0.9850,0.7815,0.9265;0.9845,0.7846,0.9355;0.9839,0.7878,0.9446;0.9833,0.7909,0.9537;0.9827,0.7941,0.9629;0.9820,0.7972,0.9721;0.9814,0.8004,0.9813])
end
colorder = [17, 138, 178;82, 43, 41; 204, 164, 59; 67, 100, 54; 228, 87, 46]/255;
set(0,'defaultAxesColorOrder',colorder)
Load basic data
load('coastlines.mat');
addpath('function')

Weather radar data

Bird density, orientation and speed for 37 weather radars in western Europe are downloaded from the ENRAM repository (ERAM, 2020) and processed as explained in Nussbaumer (2021) (https://doi.org/10.1101/2021.03.08.434434). The final dataset consists of bird density (ρ) [bird/km^3], bird flight speed following the east-west component (u) and south-north component (v) [m/s] at 15min resolutions, 200m bin altitude (0-5km) for each radar are available on zenodo (https://doi.org/10.5281/zenodo.3610184).
load('../2018/data/dc_corr.mat','dc');
Declare variable used later
dc_alt = dc(1).alt;
dc_time = dc(1).time;
ndc = numel(dc);
dc_lat = [dc.lat];
dc_lon = [dc.lon];
dc_name = {dc.name};
dc_dem = [dc.heightDEM];
NNT is Normalized night time (-1: sunset to 1 sunrise):
NNT = datenum(repmat(dc_time',1,ndc)-mean(cat(3,[dc.dawn],[dc.dusk]),3)) ./ datenum([dc.dawn]-[dc.dusk])*2;
We convert the structure data to matrix to ease of use later. At the same time, we do the following (1) convert orientation and speed into vector (NS, EW componenents as complex value), (2) remove data below ground level and most importantly (3) remove all interpolated data because we are not interested in the spatio-temporal consistency of the data, but rather limiting our analysis to the most only original data.
gs=nan(numel(dc_time), numel(dc_alt), ndc); dens=gs; sd_vvp=gs;
for i_d=1:ndc
% data to keep
keep = true(size(dc(i_d).dens4));
keep(repmat(1:dc(i_d).scatter_lim,numel(dc_time),1))=false; % remvove below ground
keep(isnan(dc(i_d).dens3) | dc(i_d).dens3==0)=false; % remove when not interpolated
keep(NNT(:,i_d)<-1 & NNT(:,i_d)>1,:) = false;
% density
tmp = dc(i_d).dens4; tmp(~keep)=nan;
dens(:,:,i_d) = tmp;
% variance of speed
tmp = dc(i_d).sd_vvp; tmp(~keep)=nan;
sd_vvp(:,:,i_d) = tmp;
% groundspeed vector
keep(isnan(dc(i_d).u) | isnan(dc(i_d).v))=false; % remove when not interpolated
tmp = dc(i_d).ub + 1i*dc(i_d).vb; tmp(~keep)=nan;
gs(:,:,i_d) = tmp;
end

Climate Reanalaysis

The U (parmID=131) and V (parmID=132) component of wind and the air temperature t (parmID=130) are downloaed from the ERA5 reanalysis (https://doi.org/10.24381/cds.bd0915c6) at pressure level (from 1000hPa to 550hPa), downloaded at the maximal resoluation (hourly and 0.25°x0.25°). All three variables are linearly interpolated (time-space 4D) at each datapoint of the weather radar data (see https://rafnuss-postdoc.github.io/BMM/2018/LiveScript/Insect_removal.html#H_38C69C30) using the barometric formula.

Windspeed

ws=nan(numel(dc_time), numel(dc_alt), ndc);
for i_d=1:ndc
ws(:,:,i_d) = dc(i_d).ws; % windspeed vector
end

Airspeed

Airspeed vector
as = gs-ws;

Wind profit

Assuming a migration orientation of 225° (or 45°), the wind profit, quantify the wind support in the direction of migration (i.e., independant from the bird speed)
v_wp = cosd(45)*real(ws) + sind(45)*imag(ws);
Using the actual ground speed orientation.
tmp=ws .* gs./abs(gs);
v_wpw = real(tmp)+imag(tmp);

Temperature

wt=nan(numel(dc_time), numel(dc_alt), ndc);
for i_d=1:ndc
wt(:,:,i_d) = dc(i_d).wt; % windspeed vector
end

Reshape data as table

Reshape into table to reduce space and help in the analysis
[tmp_time, tmp_alt, tmp_radar] = ndgrid(datenum(dc_time),dc_alt,1:37);
tmp_nnt = repmat(permute(NNT,[1 3 2]),1,25,1);
id=isnan(dens(:)) | isnan(gs(:));
T = table(dens(~id),abs(gs(~id)),angle(gs(~id)),abs(as(~id)),angle(as(~id)),abs(ws(~id)),angle(ws(~id)),v_wp(~id),v_wpw(~id), sd_vvp(~id), tmp_nnt(~id),tmp_time(~id),tmp_alt(~id),tmp_radar(~id),'VariableNames',{'dens','gs','gd','as','ad','ws','wd','wsp','wpw','sd_vvp','NNT','time','alt','r'});
T
T = 10675260×14 table
 densgsgdasadwswdwspwpwsd_vvpNNTtimealtr
10.03680.77871.65626.88160.07906.93053.1080-4.7332-6.56213.10130.05307.3720e+057001
20.04014.54580.230111.38730.06726.94093.1024-4.7118-8.13153.33360.07727.3720e+057001
30.04733.72963.08923.2223-0.03606.95173.0968-4.69036.24383.43800.10147.3720e+057001
40.05103.62113.02863.35630.01726.96263.0912-4.66895.73683.49320.12567372047001
50.07432.79623.00784.17630.00636.95613.0917-4.66755.56853.36900.14987.3720e+057001
60.07462.2728-2.89864.8179-0.18566.94963.0923-4.66618.15763.31990.17407.3720e+057001
70.07190.92200.19827.8404-0.02006.94313.0929-4.6647-7.89953.17770.19827.3720e+057001
80.07144.6320-0.300411.4804-0.14906.93673.0935-4.6633-4.15053.31920.22247.3720e+057001
90.04042.6249-0.64119.2237-0.20746.93023.0940-4.6619-0.94693.23160.24667.3720e+057001
100.08171.7977-3.08905.1381-0.08186.92373.0946-4.66056.96243.24020.27087.3720e+057001
110.08211.09632.91665.8416-0.01316.91723.0952-4.65914.81013.15320.29507.3720e+057001
120.10738.1082-0.364114.8304-0.21786.91083.0958-4.6577-3.58413.36800.31927.3720e+057001
130.13431.2162-2.58915.9386-0.16086.90433.0963-4.65639.38893.39000.34347.3720e+057001
140.06845.0073-0.118911.8971-0.07596.89783.0969-4.6548-5.68253.28480.36767.3720e+057001
150.07322.6631-0.37729.4483-0.13646.89143.0975-4.6534-3.47083.23820.39187.3720e+057001
160.05621.6695-2.61785.5499-0.20596.88493.0981-4.65209.28693.14310.41607.3720e+057001
170.05499.6191-0.281516.4860-0.18056.98373.1005-4.7312-4.40933.24440.44027.3720e+057001
180.03705.6967-0.452112.5104-0.22277.08263.1029-4.8104-2.90753.28080.46447.3720e+057001
190.03831.3405-0.64228.3185-0.12837.18143.1051-4.8896-1.08213.13340.48867.3720e+057001
200.05382.4888-3.07414.8111-0.08687.28033.1074-4.96887.51873.30920.51287.3720e+057001
210.09220.5068-0.82107.7447-0.07857.37933.1095-5.04790.70573.40030.53707.3720e+057001
220.10354.51010.076711.97230.01027.47823.1116-5.1271-7.81973.29870.56127.3720e+057001
230.08031.7980-0.22479.3471-0.06557.57723.1137-5.2063-5.44273.37240.58547.3720e+057001
240.11422.32970.54979.71380.10507.67633.1157-5.2855-10.48653.41350.60967.3720e+057001
250.15880.74421.37207.93870.06857.77533.1176-5.3647-9.30123.25970.63387.3720e+057001
260.21775.01580.423612.58740.15067.87443.1195-5.4439-10.32583.43550.65807.3720e+057001
270.09733.06581.35979.06930.31817.97363.1214-5.5230-9.58903.35450.68227.3720e+057001
280.08182.04092.56106.43850.15148.07273.1232-5.60222.11553.37170.70647.3720e+057001
290.14014.95370.428512.65130.15008.00523.1206-5.5404-10.52233.35960.73067.3720e+057001
300.06229.03070.717015.82330.37177.93783.1180-5.4787-11.17833.42870.75487.3720e+057001
310.10063.52731.29549.38470.34657.87053.1153-5.4169-9.85363.51400.77907.3720e+057001
320.06173.17092.15436.51870.38037.80323.1125-5.3551-2.52613.38050.80327.3720e+057001
330.04824.36831.93217.28280.55547.73603.1098-5.2934-4.81713.26610.82747.3720e+057001
340.03096.77471.63669.71010.73267.66883.1070-5.2316-7.42613.18950.85167.3720e+057001
350.03126.85582.37235.21911.03367.60173.1041-5.1698-0.22993.17980.87587.3720e+057001
360.01567.13802.53344.12731.15417.53473.1012-5.10811.45242.98080.90007.3720e+057001
370.00607.80081.90888.55850.96497.46773.0982-5.0463-4.97762.57330.92427.3720e+057001
380.00249.91031.632711.71010.95337.40083.0951-4.9845-7.28572.27670.94847.3720e+057001
390.00127.79912.38535.25541.25107.33403.0921-4.9228-0.21212.04240.97267.3720e+057001
400.00089.51102.08128.33561.25227.26723.0889-4.8610-3.30781.94980.99687.3720e+057001
410.000610.74102.08549.17541.35817.23383.0889-4.8383-3.25231.82931.02107.3720e+057001
420.00067.67292.79802.20511.58637.20043.0888-4.81563.86211.80131.04527.3720e+057001
430.000912.66312.071810.78201.47097.16693.0887-4.7930-3.35401.80091.06947.3720e+057001
440.001215.49622.013813.63111.53567.13353.0887-4.7703-3.88451.81751.09367.3720e+057001
450.001611.81642.13129.66701.48697.10013.0886-4.7476-2.75561.90531.11787.3720e+057001
460.001810.55112.10938.83741.38357.06673.0885-4.7249-2.95241.96421.14207.3720e+057001
470.002511.64172.014510.34111.37377.03333.0885-4.7023-3.82542.03441.16627.3720e+057001
480.00279.99252.08988.54971.33076.99993.0884-4.6796-3.10962.05291.19047.3720e+057001
490.002314.65723.056214.1722-3.08562.09311.78941.1239-1.79661.4998-1.18937.3720e+057001
500.00109.49332.80228.56053.02462.20711.77611.2098-2.48231.3246-1.16507.3720e+057001
510.00077.07612.61645.81672.92152.32151.76411.2956-2.95121.2372-1.14067.3720e+057001
520.00076.76832.69115.67783.04432.43611.75321.3815-2.99431.1635-1.11637.3720e+057001
530.000710.33992.57468.82422.78982.55101.74341.4673-3.33551.1608-1.09197.3720e+057001
540.00076.35172.40284.56882.77292.66621.73431.5532-3.68761.2135-1.06767.3720e+057001
550.00048.66302.29896.50272.53292.78151.72601.6391-3.91481.1819-1.04327.3720e+057001
560.00024.90312.02022.30102.41712.91981.71071.7566-4.05001.2225-1.01887.3720e+057001
570.000313.20811.710410.14981.71453.05871.69671.8742-3.75391.4246-0.99457.3720e+057001
580.001014.44951.724811.25491.73643.19811.68391.9918-3.92871.7253-0.97017.3720e+057001
590.003615.21291.969712.06132.05093.33801.67222.1093-4.53002.0823-0.94587.3720e+057001
600.008414.56691.943411.26762.02953.47831.66142.2269-4.66612.2740-0.92147.3720e+057001
610.00885.65112.15053.01952.76143.61901.65152.3444-5.07822.3185-0.89707.3720e+057001
620.00835.60412.17313.03292.85153.76011.64232.4620-5.28452.2487-0.87277.3720e+057001
630.00684.5968-2.28837.8638-1.93173.90141.63382.57960.72032.1528-0.84837.3720e+057001
640.00783.8147-0.50796.8819-1.02784.04301.62592.69715.40442.1680-0.82407.3720e+057001
650.00494.6571-2.40378.0010-1.98864.18481.61852.81470.00082.0774-0.79967.3720e+057001
660.00881.60293.05234.4149-1.89834.32691.61162.9323-4.53182.1676-0.77537.3720e+057001
670.00537.4911-2.229911.2952-1.97434.46911.60513.04981.01052.1009-0.75097.3720e+057001
680.00415.3752-0.20567.8984-0.79604.55421.62873.02875.17512.1028-0.72657.3720e+057001
690.00381.1643-0.43755.3154-1.29884.64171.65133.00755.97122.0587-0.70227.3720e+057001
700.00333.6038-0.61157.5963-1.10174.73151.67312.98646.43772.1074-0.67787.3720e+057001
710.00344.8477-0.26718.0351-0.85564.82341.69412.96525.46482.1097-0.65357.3720e+057001
720.00545.7084-0.39949.2613-0.87134.91751.71432.94416.00202.1041-0.62917.3720e+057001
730.00348.0527-0.481411.7678-0.82905.01341.73372.92296.33102.0831-0.60487.3720e+057001
740.00455.11640.07807.5967-0.65515.11121.75242.90183.62732.1766-0.58047.3720e+057001
750.00464.14550.38006.0487-0.63125.21061.77042.88061.50582.1796-0.55607.3720e+057001
760.00457.61310.16379.5121-0.42785.31171.78772.85952.95842.2042-0.53177.3720e+057001
770.006211.7281-0.024114.1149-0.40415.41441.80442.83834.17012.2978-0.50737.3720e+057001
780.00724.93760.80295.1181-0.35845.51851.82042.8172-2.06042.2735-0.48307.3720e+057001
790.00646.81780.42628.1120-0.32745.62391.83592.79600.74732.2919-0.45867.3720e+057001
800.00925.99510.58146.7411-0.32515.61741.81872.8762-0.34872.3555-0.43437.3720e+057001
810.00655.24250.89884.7461-0.29095.61251.80142.9564-2.67702.3380-0.40997.3720e+057001
820.00759.02120.219110.5955-0.33885.60931.78423.03652.74192.3701-0.38557.3720e+057001
830.00704.76391.20682.9793-0.35965.60781.76693.1167-4.59172.3294-0.36127.3720e+057001
840.00725.49390.67315.6920-0.37665.60801.74963.1969-0.52732.4309-0.33687.3720e+057001
850.00725.24600.86614.5682-0.34395.60981.73233.2770-1.90312.4208-0.31257.3720e+057001
860.00856.78740.36167.8198-0.41515.61331.71513.35722.19012.4644-0.28817.3720e+057001
870.00984.99350.74324.9069-0.46375.61851.69793.4374-0.67332.5002-0.26387.3720e+057001
880.01135.37860.75634.9117-0.39735.62531.68073.5175-0.64192.5551-0.23947.3720e+057001
890.00898.70170.123810.2183-0.45995.63381.66353.59774.29192.5216-0.21507.3720e+057001
900.00805.53870.70495.0728-0.41365.64391.64643.67790.03852.5138-0.19077.3720e+057001
910.007010.18980.130711.2924-0.39245.65571.62943.75804.49042.5064-0.16637.3720e+057001
920.009811.2506-0.047613.1024-0.50045.75641.61563.88395.77252.5637-0.14207.3720e+057001
930.00815.33400.67375.0338-0.52605.85811.60234.00970.66332.5436-0.11767.3720e+057001
940.00999.38910.021911.1053-0.54475.96091.58954.13555.71422.6170-0.09327.3720e+057001
950.00697.94540.04629.8012-0.62036.06451.57714.26135.73822.5131-0.06897.3720e+057001
960.00968.1976-0.174811.0581-0.75716.16911.56514.38717.17662.5822-0.04457.3720e+057001
970.00864.77950.95013.5813-0.72906.27451.55354.5129-1.30342.5016-0.02027.3720e+057001
980.01315.74180.03028.3295-0.84046.38081.54234.63876.36982.59310.00427.3720e+057001
990.01405.8125-0.15269.1871-0.93046.48781.53144.76457.60652.65580.02857.3720e+057001
1000.01077.3023-0.248010.7607-0.89276.59561.52104.89038.24082.56270.05297.3720e+057001
Twt = wt(~id);
clear as gs ws dens sd_vvp tmp* NNT id

Method

We split the dataset in over space and time.

Group dataset : Seasonal

Over time, we define 4 periods: Early spring (March), Late spring (April), Early autumn (august-september) and late autumn (October). Note that we might want to redefine this period to match bird migration data (e.g., MTR). Here a coarse approach is to use entire month.
id_sp = T.time>datenum('1-Mar-2018') & T.time<datenum('1-May-2018');
id_esp = T.time>datenum('1-Mar-2018') & T.time<datenum('1-April-2018');
id_lsp = T.time>datenum('1-April-2018') & T.time<datenum('1-May-2018');
id_au = T.time>datenum('1-August-2018') & T.time<datenum('1-Nov-2018');
id_eau = T.time>datenum('1-August-2018') & T.time<datenum('1-Oct-2018');
id_lau = T.time>datenum('1-Oct-2018') & T.time<datenum('1-Nov-2018');
All periods combined
id_s = [id_sp id_au id_esp id_lsp id_eau id_lau];
id_s_name = {'Spring','Autumn','March','April','Aug-sept.','October'};
id_s_col = [38, 70, 83;42, 157, 143;233, 196, 106;244, 162, 97];
id_sp_col = [51 137 86]/255;
id_au_col = [229 103 7]/255;
We might also want to compare data of 2016 to see the difference.
id_2016 = T.time>datenum('19-Sep-2018') & T.time<datenum('9-Oct-2018');
T.season = id_s(:,1)*2-1;

Group dataset: Geographic

We group radars in two groups of equal size based on their position along the general flow of migration (south-west / north east gradient with a flow orientation of 222°). The Southern group include all French radar (18) exepect frman and the northern group include all germans (16), dutch (2) and Belgium (1) radars.
id_no = [true(16,1); false(12,1); true ;false(6,1) ;true(2,1)];
id_so = ~id_no;
id_de = [false; true(15,1); false(21,1)];
id_fr = [false(16,1); true(19,1); false(2,1)];
id_sno_col = [82 88 166; 178 164 34]/255;

Results

Over time

Compute the daily ground speed, airspeed and windspeed.
[G_day,day_num]=findgroups(datenum(dateshift(datetime(T.time,'convertfrom','datenum'),'start','day','nearest')));
day_num_full = min(day_num):max(day_num);
[~,Locb] = ismember(day_num,day_num_full);
 
densd = nan(numel(day_num_full),1);
densd(Locb) = splitapply(@nansum,T.dens,G_day);
mt=nan(numel(day_num_full),5);
mt(Locb,1) = splitapply(@nansum,T.as.*T.dens,G_day) ./ densd(Locb);
mt(Locb,2) = splitapply(@nansum,T.gs.*T.dens,G_day) ./ densd(Locb);
mt(Locb,3) = splitapply(@nansum,T.ws.*T.dens,G_day) ./ densd(Locb);
mt(Locb,4) = splitapply(@nansum,T.wsp.*T.dens,G_day) ./ densd(Locb);
mt(Locb,5) = splitapply(@nansum,T.sd_vvp.*T.dens,G_day) ./ densd(Locb);
Moving average
mtm = movmean(mt.*densd,7,'omitnan') ./ movmean(densd,7,'omitnan');
mtm(isnan(densd),:)=nan;
t = datetime(day_num_full,'convertfrom','datenum');
 
figure('position',[0 0 1200 600]); hold on; box on; axis tight; grid on;
scatter(t,mt(:,1),densd/10000,'filled')
scatter(t,mt(:,2),densd/10000,'filled')
set(gca,'ColorOrderIndex',1)
plot(t,mtm(:,1:2),'linewidth',2)
set(gca,'ColorOrderIndex',1)
id = t'<t(end/2) & ~isnan(densd) & ~isnan(mt(:,1));
fit_lm_sp = fit(datenum(t(id))'-datenum(t(1)),mt(id,1),'poly1','Weight',densd(id));
plot(t(t<t(end/2)),feval(fit_lm_sp,datenum(t(t<t(end/2)))'-datenum(t(1))),'--')
% cf = fit(datenum(t(id))'-datenum(t(1)),mt(id,2),'poly1','Weight',densd(id));
% plot(t(t<t(end/2)),feval(cf,datenum(t(t<t(end/2)))'-datenum(t(1))),'--')
fit_lm_sp2 = fit(datenum(t(id))'-datenum(t(1)),mt(id,2),'poly1','Weight',densd(id));
plot(t(t<t(end/2)),feval(fit_lm_sp2,datenum(t(t<t(end/2)))'-datenum(t(1))),'--')
fit_lm_sp3 = fit(datenum(t(id))'-datenum(t(1)),mt(id,4),'poly1','Weight',densd(id));
plot(t(t<t(end/2)),feval(fit_lm_sp3,datenum(t(t<t(end/2)))'-datenum(t(1))),'--')
set(gca,'ColorOrderIndex',1)
id = t'>t(end/2) & ~isnan(densd) & ~isnan(mt(:,1));
fit_lm_au = fit(datenum(t(id))'-datenum(t(1)),mt(id,1),'poly1','Weight',densd(id));
plot(t(t>t(end/2)),feval(fit_lm_au,datenum(t(t>t(end/2)))'-datenum(t(1))),'--')
% cf = fit(datenum(t(id))'-datenum(t(1)),mt(id,2),'poly1','Weight',densd(id));
% plot(t(t>t(end/2)),feval(cf,datenum(t(t>t(end/2)))'-datenum(t(1))),'--')
fit_lm_au2 = fit(datenum(t(id))'-datenum(t(1)),mt(id,2),'poly1','Weight',densd(id));
plot(t(t>t(end/2)),feval(fit_lm_au2,datenum(t(t>t(end/2)))'-datenum(t(1))),'--')
fit_lm_au3 = fit(datenum(t(id))'-datenum(t(1)),-mt(id,4),'poly1','Weight',densd(id));
plot(t(t>t(end/2)),feval(fit_lm_au3,datenum(t(t>t(end/2)))'-datenum(t(1))),'--')
ylim(8+[-15 15]); ylabel('Speed [m/s]')
 
yyaxis right;
ax = gca; ax.YAxis(1).Color = 'k'; ax.YAxis(2).Color = 'k';
bar(t(1:end/2),mt(1:end/2,4),1,'k','FaceAlpha',0.2);
bar(t(end/2:end),-mt(end/2:end,4),1,'k','FaceAlpha',0.2);
legend('Daily airspeed','Daily groundspeed','7 days trend airspeed','7 days trend groundspeed','Wind profit','Orientation','horizontal','Location','northoutside');
ylim([-15 15]); ylabel('Windspeed profit [m/s]')
fit_lm_sp_confint = confint(fit_lm_sp)*30;
fit_lm_sp_confint2 = confint(fit_lm_sp2)*30;
fit_lm_sp_confint3 = confint(fit_lm_sp3)*30;
disp(['Airspeed decreases by ' num2str(fit_lm_sp.p1*30,2) 'm/s (' num2str(fit_lm_sp_confint(1,1),2) '-' num2str(fit_lm_sp_confint(2,1),2) ') per month'])
Airspeed decreases by -0.53m/s (-0.73--0.34) per month
disp(['Groundspeed decreases by ' num2str(fit_lm_sp2.p1*30,2) 'm/s (' num2str(fit_lm_sp_confint2(1,1),2) '-' num2str(fit_lm_sp_confint2(2,1),2) ') per month'])
Groundspeed decreases by -2m/s (-2.6--1.4) per month
disp(['Windprofit decreases by ' num2str(fit_lm_sp3.p1*30,2) 'm/s (' num2str(fit_lm_sp_confint3(1,1),2) '-' num2str(fit_lm_sp_confint3(2,1),2) ') per month'])
Windprofit decreases by -1.7m/s (-2.4--1) per month
fit_lm_au_confint = confint(fit_lm_au)*30;
fit_lm_au_confint2 = confint(fit_lm_au2)*30;
fit_lm_au_confint3 = confint(fit_lm_au3)*30;
disp(['Airspeed decreases by ' num2str(fit_lm_au.p1*30,2) 'm/s (' num2str(fit_lm_au_confint(1,1),2) '-' num2str(fit_lm_au_confint(2,1),2) ') per month'])
Airspeed decreases by 0.58m/s (0.44-0.72) per month
disp(['Groundspeed decreases by ' num2str(fit_lm_au2.p1*30,2) 'm/s (' num2str(fit_lm_au_confint2(1,1),2) '-' num2str(fit_lm_au_confint2(2,1),2) ') per month'])
Groundspeed decreases by 0.57m/s (0.19-0.94) per month
disp(['Windprofit decreases by ' num2str(fit_lm_au3.p1*30,2) 'm/s (' num2str(fit_lm_au_confint3(1,1),2) '-' num2str(fit_lm_au_confint3(2,1),2) ') per month'])
Windprofit decreases by 0.25m/s (-0.34-0.85) per month
figure('position',[0 0 1400 800]);
for i_s=1:2
subplot(4,2,[(i_s-1)*4+1 (i_s-1)*4+3]); hold on;
[b,h,Ma,Sa] = histvdens(T.as(id_s(:,i_s)),T.dens(id_s(:,i_s)));
tmp1 = bar(b,h,1,'FaceAlpha',0.6, 'DisplayName',['Airspeed. M=' num2str(Ma,3) ' ; S=' num2str(Sa,3)]);
[b,h,Mg,Sg] = histvdens(T.gs(id_s(:,i_s)),T.dens(id_s(:,i_s)));
tmp2 = bar(b,h,1,'FaceAlpha',0.6, 'DisplayName',['Groundspeed. M=' num2str(Mg,3) ' ; S=' num2str(Sg,3)]);
yticks([]); yticklabels(''); xlim([0 25]); ylabel(id_s_name{i_s})
if i_s==2
xlabel('Speed [m/s]');
else
xticklabels('');
end
yyaxis right;
[b,h,Mw,Sw] = histvdens(T.ws(id_s(:,i_s)),T.dens(id_s(:,i_s)));
tmp3 = bar(b,h,1,'FaceAlpha',0.6, 'DisplayName', ['Windspeed. M=' num2str(Mw,3) ' ; S=' num2str(Sw,3)]);
% [b,h,Mw,Sw] = histvdens(T.wsp(id_sp),T.dens(id_sp));
% bar(b,h./sum(h),1,'FaceAlpha',0.6, 'DisplayName', ['Windprofit 45°. M=' num2str(Mw,3) ' ; S=' num2str(Sw,3)]);
% yyaxis left;
% [b,h,Ms,Ss] = histvdens(T.sd_vvp(id_s(:,i_s)),T.dens(id_s(:,i_s)));
% tmp4 = bar(b,h,1,'FaceAlpha',0.6, 'DisplayName',['sd vvp. M=' num2str(Mg,3) ' ; S=' num2str(Sg,3)]);
xline(Ma,'label',num2str(Ma,3),'color',tmp1.FaceColor,'linewidth',2,'alpha',.6)
xline(Mg,'label',num2str(Mg,3),'color',tmp2.FaceColor,'linewidth',2,'alpha',.6)
xline(Mw,'label',num2str(Mw,3),'color',tmp3.FaceColor,'linewidth',2,'alpha',.6)
% xline(Ms,'label',num2str(Ms,3),'color',tmp4.FaceColor,'linewidth',2,'alpha',.6)
yticks([]); yticklabels(''); grid on
% xlabel([id_s_name{i} '. Bird speed [m/s]. Total nb: ' num2str(sum(T.dens(id_s(:,i)))/1000000,3) ' M']);
box on; ax = gca; ax.YAxis(2).Color = 'k'; xlim([0 25])
end
 
for i_s=3:6
subplot(4,2,2+(i_s-3)*2); hold on
[b,h,Ma,Sa] = histvdens(T.as(id_s(:,i_s)),T.dens(id_s(:,i_s)));
tmp1 = bar(b,h,1,'FaceAlpha',0.6, 'DisplayName',['M=' num2str(Ma,3) ' ; S=' num2str(Sa,3)]);
[b,h,Mg,Sg] = histvdens(T.gs(id_s(:,i_s)),T.dens(id_s(:,i_s)));
tmp2 = bar(b,h,1,'FaceAlpha',0.6, 'DisplayName',['M=' num2str(Mg,3) ' ; S=' num2str(Sg,3)]);
yticks([]); yticklabels(''); xlim([0 25])
ylabel(id_s_name{i_s})
if i_s==6
xlabel('Speed [m/s]');
else
xticklabels('');
end
yyaxis right;
[b,h,Mw,Sw] = histvdens(T.ws(id_s(:,i_s)),T.dens(id_s(:,i_s)));
tmp3 = bar(b,h,1,'FaceAlpha',0.6, 'DisplayName', ['Windspeed. M=' num2str(Mw,3) ' ; S=' num2str(Sw,3)]);
%legend; xlabel([id_s_name{i_s} '. Total nb: ' num2str(sum(T.dens(id_s(:,i_s)))/1000000,3) ' M']);xlim([0 30]);
% yyaxis left;
% [b,h,Ms,Ss] = histvdens(T.sd_vvp(id_s(:,i_s)),T.dens(id_s(:,i_s)));
% tmp4 = bar(b,h,1,'FaceAlpha',0.6, 'DisplayName',['sd vvp. M=' num2str(Mg,3) ' ; S=' num2str(Sg,3)]);
box on; ax = gca; ax.YAxis(2).Color = 'k';
xline(Ma,'label',num2str(Ma,3),'color',tmp1.FaceColor,'linewidth',2,'alpha',.6)
xline(Mg,'label',num2str(Mg,3),'color',tmp2.FaceColor,'linewidth',2,'alpha',.6)
xline(Mw,'label',num2str(Mw,3),'color',tmp3.FaceColor,'linewidth',2,'alpha',.6)
% xline(Ms,'label',num2str(Ms,3),'color',tmp4.FaceColor,'linewidth',2,'alpha',.6)
box on; ax = gca; ax.YAxis(2).Color = 'k';
yticks([]); yticklabels(''); grid on; xlim([0 25])
end

Wind direction

figure('position',[0 0 900 900]);
ha=tight_subplot(2,2,.01,[.09 0.09],[.08 0.01]);
axes(ha(1))
[b,h] = histCdens(T.gd(T.season==1), T.dens(T.season==1)); polarplot(b,h,'linewidth',2,'Color',colorder(2,:)); hold on;
[b,h] = histCdens(T.ad(T.season==1), T.dens(T.season==1)); polarplot(b,h,'linewidth',2,'Color',colorder(1,:))
[b,h] = histCdens(T.wd(T.season==1), T.dens(T.season==1)); polarplot(b,h,'linewidth',2,'Color',colorder(3,:))
h2 = histcounts(T.wd(T.season==1),-pi:0.1:pi); polarplot(b,h2./sum(h2)*sum(h),'--','linewidth',1,'Color',colorder(3,:))
legend('Ground','Air','Wind','Available Wind','Location','southwest')
 
axes(ha(2))
[b,h] = histCdens(T.gd(T.season==-1), T.dens(T.season==-1)); polarplot(b,h,'linewidth',2,'Color',colorder(2,:)); hold on;
[b,h] = histCdens(T.ad(T.season==-1), T.dens(T.season==-1)); polarplot(b,h,'linewidth',2,'Color',colorder(1,:))
[b,h] = histCdens(T.wd(T.season==-1), T.dens(T.season==-1)); polarplot(b,h,'linewidth',2,'Color',colorder(3,:))
h2 = histcounts(T.wd(T.season==1),-pi:0.1:pi); polarplot(b,h2./sum(h2)*sum(h),'--','linewidth',1,'Color',colorder(3,:))
axes(ha(3))
[b,h] = histCdens(T.gd(T.season==1), T.dens(T.season==1).*T.gs(T.season==1)); polarplot(b,h,'linewidth',2,'Color',colorder(2,:)); hold on;
[b,h] = histCdens(T.ad(T.season==1), T.dens(T.season==1).*T.as(T.season==1)); polarplot(b,h,'linewidth',2,'Color',colorder(1,:))
[b,h] = histCdens(T.wd(T.season==1), T.dens(T.season==1).*T.ws(T.season==1)); polarplot(b,h,'linewidth',2,'Color',colorder(3,:))
 
axes(ha(4))
[b,h] = histCdens(T.gd(T.season==-1), T.dens(T.season==-1).*T.gs(T.season==-1)); polarplot(b,h,'linewidth',2,'Color',colorder(2,:)); hold on;
[b,h] = histCdens(T.ad(T.season==-1), T.dens(T.season==-1).*T.as(T.season==-1)); polarplot(b,h,'linewidth',2,'Color',colorder(1,:))
[b,h] = histCdens(T.wd(T.season==-1), T.dens(T.season==-1).*T.ws(T.season==-1)); polarplot(b,h,'linewidth',2,'Color',colorder(3,:))

Over space

%pplot = {'w','ww','gw','aw','wp','d'};
pplot = {'g','w','a'};
 
figure('position',[0 0 1600 350*numel(pplot)]);
ha=tight_subplot(numel(pplot),4,.01,[.1 0],[.06 0]); u=1;
for i_p =1:numel(pplot)
for i_s = 1:4
axes(ha(u)); u=u+1;
% subplot(numel(pplot),4,4*(i_p-1)+i_s); hold on;
h=worldmap([floor(min(dc_lat)-1) ceil(max(dc_lat))], [floor(min(dc_lon)-1) ceil(max(dc_lon))+1]);
setm(h,'frame','on','grid','off'); set(findall(h,'Tag','MLabel'),'visible','off'); set(findall(h,'Tag','PLabel'),'visible','off')
%geoshow('landareas.shp', 'FaceColor', [200 200 200]./255);
% plotm(coastlat, coastlon,'k'); % geoshow('worldrivers.shp','Color', 'blue');
box on; bordersm('countries', 'FaceColor', [200 200 200]./255)
% axis([floor(min(dc_lon)-1) ceil(max(dc_lon))+1 floor(min(dc_lat)-1) ceil(max(dc_lat))])
 
tmp=zeros(4,ndc);
for i_d=1:ndc
id = id_s(:,i_s+2)&T.r==i_d;
w = T.dens(id) ./ sum(T.dens(id));
tmp(1,i_d) = sum(w.*T.(pplot(i_p)+"s")(id));
tmp(2,i_d) = sum(w.*T.(pplot(i_p)+"s")(id).*cos(T.(pplot(i_p)+"d")(id)));
tmp(3,i_d) = sum(w.*T.(pplot(i_p)+"s")(id).*sin(T.(pplot(i_p)+"d")(id)));
tmp(4,i_d) = nansum(T.dens(id));
end
tmp(1:3,tmp(1,:)==0)=nan;
% scatterm(dc_lat(~isnan(tmp(1,:))),dc_lon(~isnan(tmp(1,:))),200,'k','filled');
scatterm(dc_lat,dc_lon,tmp(4,:)/1000+1,tmp(1,:),'filled');
quiverm(dc_lat,dc_lon,tmp(3,:)/5,tmp(2,:)/5,'k');
if i_s==1
ylabel(pplot{i_p})
end
if i_p==numel(pplot)
xlabel(id_s_name{i_s+2});
end
caxis([0 15])
end
end