Add a shaded area to the plot in Matlab

I am working on a graph of environment variables (lines) and the interquartile range for these variables from several years (gray shades) compared to the day of the year. I use Matlab 2014b, and because I use more than one axis, I use plotyy. My graph is as follows:

EnvironmentDOYPlot

I want to add a shaded area in the interquartile range for the average daily air temperature (temp. In the legend), as well as for SWE and precipitation. The problem is that the temperature uses different axes, and when I try to determine which axis to use to add the hatched 'area', I get an error message:

>Error using area (line 35) >Cannot set property to a deleted object > >Error in env_plot_for_stack_overflow (line 43) >THarea=area(haxes(2),doy_mean_T(:,1),shadearea); 

If I do not determine which axis to use, I do not get an error, but the interquartile range displays on the precipitation / SWE axis, and not on the temperature axis.

Here is my code to reproduce the first 30 days of my figure and error. If you copy this into a script, the problem will be a little after line 40.

 %% Data & definitions SWE_stats = [1, 117.348000000000, 91.4400000000000, 141.605000000000;2, 118.533333333333, 91.4400000000000, 144.145000000000;3, 119.549333333333, 91.4400000000000, 144.780000000000;4, 121.412000000000, 96.5200000000000, 146.685000000000;5, 122.936000000000, 96.5200000000000, 146.685000000000;6, 126.153333333333, 97.7900000000000, 148.590000000000;7, 128.185333333333, 97.7900000000000, 148.590000000000;8, 129.709333333333, 102.235000000000, 151.765000000000;9, 131.572000000000, 102.235000000000, 152.400000000000;10, 132.588000000000, 102.235000000000, 154.305000000000;11, 134.789333333333, 104.140000000000, 154.940000000000;12, 136.144000000000, 104.140000000000, 156.845000000000;13, 138.006666666667, 104.775000000000, 159.385000000000;14, 138.853333333333, 104.140000000000, 159.385000000000;15, 139.022666666667, 104.140000000000, 161.290000000000;16, 140.038666666667, 107.315000000000, 161.290000000000;17, 140.546666666667, 107.315000000000, 161.290000000000;18, 142.917333333333, 109.220000000000, 163.195000000000;19, 145.457333333333, 110.490000000000, 167.005000000000;20, 148.674666666667, 109.855000000000, 173.355000000000;21, 149.860000000000, 111.760000000000, 177.165000000000;22, 152.061333333333, 111.760000000000, 179.070000000000;23, 154.093333333333, 111.760000000000, 180.340000000000;24, 155.617333333333, 111.760000000000, 182.245000000000;25, 157.818666666667, 111.760000000000, 182.245000000000;26, 158.496000000000, 112.395000000000, 184.150000000000;27, 160.020000000000, 112.395000000000, 186.055000000000;28, 161.036000000000, 112.395000000000, 186.690000000000;29, 162.390666666667, 114.300000000000, 189.230000000000;30, 163.914666666667, 114.935000000000, 189.230000000000]; doy_Sum_precip = [1, 0.169333333333333, 0, 0.254000000000000;2, 1.79840000000000, 0, 1.56350000000000;3, 0.926400000000000, 0, 0.925000000000000;4, 1.09773333333333, 0, 2.31350000000000;5, 1.70760000000000, 0, 1.65100000000000;6, 0.802866666666667, 0, 1.20650000000000;7, 1.08426666666667, 0, 0.190500000000000;8, 0.592666666666667, 0, 0.698500000000000;9, 1.32026666666667, 0, 1.46050000000000;10, 2.35740000000000, 0, 1.58750000000000;11, 1.24480000000000, 0, 1.67900000000000;12, 1.08400000000000, 0, 1.39700000000000;13, 0.377333333333333, 0, 0.790500000000000;14, 0.203200000000000, 0, 0;15, 0.304800000000000, 0, 0;16, 0.728400000000000, 0, 0.952500000000000;17, 1.78973333333333, 0, 1.01600000000000;18, 2.09146666666667, 0, 2.15900000000000;19, 3.64760000000000, 0, 8.02000000000000;20, 0.947200000000000, 0, 0.940500000000000;21, 1.81280000000000, 0, 1.20650000000000;22, 1.05040000000000, 0, 2.03200000000000;23, 1.04933333333333, 0, 1.39800000000000;24, 1.22426666666667, 0, 0.577000000000000;25, 1.21386666666667, 0, 2.14000000000000;26, 1.39800000000000, 0, 2.08300000000000;27, 0.406400000000000, 0, 0.381000000000000;28, 0.480133333333333, 0, 0.254000000000000;29, 1.04986666666667, 0, 0.190500000000000;30, 2.87186666666667, 0, 1.71450000000000]; doy_mean_T = [1, -8.09985972222222, -11.1540625000000, -4.68436979166667;2, -5.79463055555556, -8.83109375000000, -1.22841145833333;3, -6.15105277777778, -9.55364583333333, -0.743854166666667;4, -6.92336388888889, -10.3746354166667, -2.77996875000000;5, -7.25890694444444, -11.0315625000000, -4.07119791666667;6, -6.18180833333333, -10.4846354166667, -2.76178125000000;7, -5.54212777777778, -9.26921875000000, -1.93483854166667;8, -5.09104166666667, -8.83031250000000, -1.83472395833333;9, -4.96344583333333, -8.44984375000000, -1.28418229166667;10, -5.27322916666667, -7.72354166666667, -0.434656250000000;11, -5.80188055555556, -9.92223958333334, -1.75604166666667;12, -6.99728333333334, -10.4307291666667, -3.12812500000000;13, -7.50514166666667, -10.4349479166667, -2.81125520833333;14, -6.15788888888889, -8.36640625000000, -1.33665104166667;15, -5.94321805555556, -7.64838541666667, -3.19562500000000;16, -7.18778888888889, -10.8927604166667, -4.12190625000000;17, -7.81982500000000, -11.9085937500000, -2.91764062500000;18, -5.99718750000000, -10.1986458333333, -2.70777083333333;19, -4.83423333333333, -8.95630208333333, -1.95089062500000;20, -5.49905833333333, -10.3791666666667, -2.15208333333333;21, -5.49337222222222, -8.93609375000000, -2.93130208333333;22, -6.19372638888889, -9.28411458333333, -3.25116145833333;23, -5.30543611111111, -9.65098958333334, -2.07925000000000;24, -4.39752361111111, -7.25994791666667, -1.20045833333333;25, -3.94550694444445, -5.87848958333333, -0.259760416666667;26, -5.62684305555556, -6.75958333333333, -3.34563541666667;27, -6.46449444444444, -10.5350520833333, -1.48580729166667;28, -7.41584861111111, -11.0597395833333, -3.56207812500000;29, -9.58481111111111, -12.7808854166667, -6.40843750000000;30, -7.77898888888889, -11.7937500000000, -3.38882812500000]; SmallFont=14; %% Plot example figure(1) % First variable: SWE % Add shaded area between SWE 25 and 75 percentiles shadearea=[SWE_stats(:,3), (SWE_stats(:,4)-SWE_stats(:,3))]; SWEHarea=area(SWE_stats(:,1),shadearea); hold on; % % Second variable: precipitation % Add shaded area between Precip 25 and 75 percentiles shadearea=[doy_Sum_precip(:,3), (doy_Sum_precip(:,4)-doy_Sum_precip(:,3))]; precipHarea=area(doy_Sum_precip(:,1),shadearea); % Using plotyy allows for two y axes [haxes,hprecip,htemp]=plotyy(doy_Sum_precip(:,1),doy_Sum_precip(:,2),doy_mean_T(:,1),doy_mean_T(:,2),'plot'); %precip and temperature set(hprecip,'Color',[0.3,0.3,0.3],... %precip color 'LineWidth',3,... 'LineStyle','-'); set(htemp,'Color',[0.3,0.3,0.3],... %temperature color 'LineWidth',3,... 'LineStyle','-.'); % Add daily SWE hSWE = plot(SWE_stats(:,1),SWE_stats(:,2),'Color',[0.3,0.3,0.3],... % plot swe 'LineWidth',3,... 'LineStyle','--'); % Third variable: Mean air temperature (need to add after plotyy to add on % same scale as mean temperature) % Plot interquartile range of daily mean air T % Add shaded area between daily mean air T 25 and 75 percentiles Tshadearea=[doy_mean_T(:,3), (doy_mean_T(:,4)-doy_mean_T(:,3))]; % THIS IS WHERE THE PROBLEM IS: %THarea=area(haxes(2),doy_mean_T(:,1),shadearea); hold off % Adjust axes properties set(haxes,{'ycolor'},{'k';'k'}) % Left color , right color ... y1_Nticks = 5; y2_Nticks = 5; y1 = linspace(-150, 400, y1_Nticks); y2 = linspace(-15, 40, y2_Nticks); set(haxes(1),'xlim',[0 366],... % set x limits 'ylim',[y1(1) y1(end)],... 'ytick',y1,... 'TickDir' , 'out' , ... 'TickLength' , [.02 .02] , ... 'Box','off'); % get rid of top border. See also 'linkaxes' set(haxes(2),'xlim',[0 366],... 'ylim',[y2(1) y2(end)],... 'ytick',y2,... 'TickDir' , 'out' , ... 'TickLength' , [.02 .02] , ... 'Box','off'); set(haxes, 'FontSize', SmallFont) % Set axes font size % Set properties for Precip IQR set(precipHarea(1),'FaceColor','none'); % Area below lower SD/iqr? set(precipHarea(2),'FaceColor',[.87 .87 .87]); % Area between upper and lower SD/iqr set(precipHarea,'LineStyle', 'none') % Line around shape % Set properties for SWE IQR set(SWEHarea(1),'FaceColor','none'); % Area below lower SD? set(SWEHarea(2),'FaceColor',[.87 .87 .87]); % Area between upper and lower SD set(SWEHarea,'LineStyle', 'none') % Line around shape % % Set line properties for mean Temperature IQR % set(THarea(1),'FaceColor','none'); % Area below lower SD? % set(THarea(2),'FaceColor',[.87 .87 .87]); % Area between upper and lower SD % set(THarea,'LineStyle', 'none') % Line around shape % Add legend leg_names={'Precip.','Temp.','SWE'}; LEG = legend([hprecip;htemp;hSWE],... leg_names,... 'Location','Best',... 'FontSize',SmallFont); set(LEG, 'Box', 'off'); % Make x and y labels ylabel(haxes(1),'Daily Precipitation & snow water (mm)','Fontsize',SmallFont) % label left y-axis ylabel(haxes(2),strcat('Daily Mean Air Temperature (',char(176),'C)'),'Fontsize',SmallFont) % label right y-axis xlabel('Day of year','Fontsize',SmallFont) 
+6
source share
1 answer

I am not a big plotyy fan, it’s convenient if you just want to have two graphics with two axes. But at the moment you want to add something, it always creates problems. I prefer to use several independent axis objects.

I tried changing your code to achieve this. Hope you understand the changes without further comment.

The main idea is to display both the hprecip and htemp objects of the independent axes, then the XTicks second axes are deleted and the y axis moves to the right:

 %% Data & definitions SWE_stats = [1, 117.348000000000, 91.4400000000000, 141.605000000000;2, 118.533333333333, 91.4400000000000, 144.145000000000;3, 119.549333333333, 91.4400000000000, 144.780000000000;4, 121.412000000000, 96.5200000000000, 146.685000000000;5, 122.936000000000, 96.5200000000000, 146.685000000000;6, 126.153333333333, 97.7900000000000, 148.590000000000;7, 128.185333333333, 97.7900000000000, 148.590000000000;8, 129.709333333333, 102.235000000000, 151.765000000000;9, 131.572000000000, 102.235000000000, 152.400000000000;10, 132.588000000000, 102.235000000000, 154.305000000000;11, 134.789333333333, 104.140000000000, 154.940000000000;12, 136.144000000000, 104.140000000000, 156.845000000000;13, 138.006666666667, 104.775000000000, 159.385000000000;14, 138.853333333333, 104.140000000000, 159.385000000000;15, 139.022666666667, 104.140000000000, 161.290000000000;16, 140.038666666667, 107.315000000000, 161.290000000000;17, 140.546666666667, 107.315000000000, 161.290000000000;18, 142.917333333333, 109.220000000000, 163.195000000000;19, 145.457333333333, 110.490000000000, 167.005000000000;20, 148.674666666667, 109.855000000000, 173.355000000000;21, 149.860000000000, 111.760000000000, 177.165000000000;22, 152.061333333333, 111.760000000000, 179.070000000000;23, 154.093333333333, 111.760000000000, 180.340000000000;24, 155.617333333333, 111.760000000000, 182.245000000000;25, 157.818666666667, 111.760000000000, 182.245000000000;26, 158.496000000000, 112.395000000000, 184.150000000000;27, 160.020000000000, 112.395000000000, 186.055000000000;28, 161.036000000000, 112.395000000000, 186.690000000000;29, 162.390666666667, 114.300000000000, 189.230000000000;30, 163.914666666667, 114.935000000000, 189.230000000000]; doy_Sum_precip = [1, 0.169333333333333, 0, 0.254000000000000;2, 1.79840000000000, 0, 1.56350000000000;3, 0.926400000000000, 0, 0.925000000000000;4, 1.09773333333333, 0, 2.31350000000000;5, 1.70760000000000, 0, 1.65100000000000;6, 0.802866666666667, 0, 1.20650000000000;7, 1.08426666666667, 0, 0.190500000000000;8, 0.592666666666667, 0, 0.698500000000000;9, 1.32026666666667, 0, 1.46050000000000;10, 2.35740000000000, 0, 1.58750000000000;11, 1.24480000000000, 0, 1.67900000000000;12, 1.08400000000000, 0, 1.39700000000000;13, 0.377333333333333, 0, 0.790500000000000;14, 0.203200000000000, 0, 0;15, 0.304800000000000, 0, 0;16, 0.728400000000000, 0, 0.952500000000000;17, 1.78973333333333, 0, 1.01600000000000;18, 2.09146666666667, 0, 2.15900000000000;19, 3.64760000000000, 0, 8.02000000000000;20, 0.947200000000000, 0, 0.940500000000000;21, 1.81280000000000, 0, 1.20650000000000;22, 1.05040000000000, 0, 2.03200000000000;23, 1.04933333333333, 0, 1.39800000000000;24, 1.22426666666667, 0, 0.577000000000000;25, 1.21386666666667, 0, 2.14000000000000;26, 1.39800000000000, 0, 2.08300000000000;27, 0.406400000000000, 0, 0.381000000000000;28, 0.480133333333333, 0, 0.254000000000000;29, 1.04986666666667, 0, 0.190500000000000;30, 2.87186666666667, 0, 1.71450000000000]; doy_mean_T = [1, -8.09985972222222, -11.1540625000000, -4.68436979166667;2, -5.79463055555556, -8.83109375000000, -1.22841145833333;3, -6.15105277777778, -9.55364583333333, -0.743854166666667;4, -6.92336388888889, -10.3746354166667, -2.77996875000000;5, -7.25890694444444, -11.0315625000000, -4.07119791666667;6, -6.18180833333333, -10.4846354166667, -2.76178125000000;7, -5.54212777777778, -9.26921875000000, -1.93483854166667;8, -5.09104166666667, -8.83031250000000, -1.83472395833333;9, -4.96344583333333, -8.44984375000000, -1.28418229166667;10, -5.27322916666667, -7.72354166666667, -0.434656250000000;11, -5.80188055555556, -9.92223958333334, -1.75604166666667;12, -6.99728333333334, -10.4307291666667, -3.12812500000000;13, -7.50514166666667, -10.4349479166667, -2.81125520833333;14, -6.15788888888889, -8.36640625000000, -1.33665104166667;15, -5.94321805555556, -7.64838541666667, -3.19562500000000;16, -7.18778888888889, -10.8927604166667, -4.12190625000000;17, -7.81982500000000, -11.9085937500000, -2.91764062500000;18, -5.99718750000000, -10.1986458333333, -2.70777083333333;19, -4.83423333333333, -8.95630208333333, -1.95089062500000;20, -5.49905833333333, -10.3791666666667, -2.15208333333333;21, -5.49337222222222, -8.93609375000000, -2.93130208333333;22, -6.19372638888889, -9.28411458333333, -3.25116145833333;23, -5.30543611111111, -9.65098958333334, -2.07925000000000;24, -4.39752361111111, -7.25994791666667, -1.20045833333333;25, -3.94550694444445, -5.87848958333333, -0.259760416666667;26, -5.62684305555556, -6.75958333333333, -3.34563541666667;27, -6.46449444444444, -10.5350520833333, -1.48580729166667;28, -7.41584861111111, -11.0597395833333, -3.56207812500000;29, -9.58481111111111, -12.7808854166667, -6.40843750000000;30, -7.77898888888889, -11.7937500000000, -3.38882812500000]; SmallFont=14; %% Plot example figure(1) ax1 = axes; %// first axes object % First variable: SWE % Add shaded area between SWE 25 and 75 percentiles shadearea=[SWE_stats(:,3), (SWE_stats(:,4)-SWE_stats(:,3))]; SWEHarea=area(ax1,SWE_stats(:,1),shadearea); hold on; % % Second variable: precipitation % Add shaded area between Precip 25 and 75 percentiles shadearea=[doy_Sum_precip(:,3), (doy_Sum_precip(:,4)-doy_Sum_precip(:,3))]; precipHarea=area(ax1,doy_Sum_precip(:,1),shadearea); % plots on diffent axes ax2 = axes('Position',ax1.Position,'Color','none'); %// second axes object hprecip = plot(doy_Sum_precip(:,1),doy_Sum_precip(:,2),'parent',ax1); hold on htemp = plot(doy_mean_T(:,1),doy_mean_T(:,2),'parent',ax2); hold on set(hprecip,'Color',[0.3,0.3,0.3],... %precip color 'LineWidth',3,... 'LineStyle','-'); set(htemp,'Color',[0.3,0.3,0.3],... %temperature color 'LineWidth',3,... 'LineStyle','-.'); % Add daily SWE hSWE = plot(SWE_stats(:,1),SWE_stats(:,2),'Color',[0.3,0.3,0.3],... % plot swe 'LineWidth',3,... 'LineStyle','--','parent',ax1); ; hold on % Third variable: Mean air temperature (need to add after plotyy to add on % same scale as mean temperature) % Plot interquartile range of daily mean air T % Add shaded area between daily mean air T 25 and 75 percentiles Tshadearea=[doy_mean_T(:,3), (doy_mean_T(:,4)-doy_mean_T(:,3))]; % THIS IS WHERE THE PROBLEM IS: THarea = area(doy_mean_T(:,1),shadearea,'parent',ax2); ax2.YAxisLocation = 'right' ax2.XTick = [] hold off % Adjust axes properties set(ax1,'ycolor','k') % Left color , right color ... set(ax2,'ycolor','k') % Left color , right color ... y1_Nticks = 5; y2_Nticks = 5; y1 = linspace(-150, 400, y1_Nticks); y2 = linspace(-15, 40, y2_Nticks); set(ax1,'xlim',[0 366],... % set x limits 'ylim',[y1(1) y1(end)],... 'ytick',y1,... 'TickDir' , 'out' , ... 'TickLength' , [.02 .02] , ... 'Box','off'); % get rid of top border. See also 'linkaxes' set(ax2,'xlim',[0 366],... 'ylim',[y2(1) y2(end)],... 'ytick',y2,... 'TickDir' , 'out' , ... 'TickLength' , [.02 .02] , ... 'Box','off'); set(ax1, 'FontSize', SmallFont) % Set axes font size set(ax2, 'FontSize', SmallFont) % Set axes font size % Set properties for Precip IQR set(precipHarea(1),'FaceColor','none'); % Area below lower SD/iqr? set(precipHarea(2),'FaceColor',[.87 .87 .87]); % Area between upper and lower SD/iqr set(precipHarea,'LineStyle', 'none') % Line around shape % Set properties for SWE IQR set(SWEHarea(1),'FaceColor','none'); % Area below lower SD? set(SWEHarea(2),'FaceColor',[.87 .87 .87]); % Area between upper and lower SD set(SWEHarea,'LineStyle', 'none') % Line around shape % % Set line properties for mean Temperature IQR set(THarea(1),'FaceColor','none'); % Area below lower SD? set(THarea(2),'FaceColor',[.87 .87 .87]); % Area between upper and lower SD set(THarea,'LineStyle', 'none') % Line around shape % Add legend leg_names={'Precip.','Temp.','SWE'}; LEG = legend([hprecip;htemp;hSWE],... leg_names,... 'Location','Best',... 'FontSize',SmallFont); set(LEG, 'Box', 'off'); % Make x and y labels ylabel(ax1,'Daily Precipitation & snow water (mm)','Fontsize',SmallFont) % label left y-axis ylabel(ax2,strcat('Daily Mean Air Temperature (',char(176),'C)'),'Fontsize',SmallFont) % label right y-axis xlabel({'','Day of year'},'Fontsize',SmallFont) 

enter image description here

(xlabel was a bit of a mistake, so I used the setting to get right)

+2
source

Source: https://habr.com/ru/post/986337/


All Articles