--- a +++ b/Supporting Functions/kakearney-boundedline-pkg-8179f9a/README.m @@ -0,0 +1,240 @@ +%% |boundedline.m|: line with shaded error/confidence bounds +% Author: Kelly Kearney +% +% This repository includes the code for the |boundedline.m| Matlab function +% and the accompanying |outlinebounds.m| function, along with all dependent +% functions required to run them. +% +% The |boundedline| function allows a user to easily plot and line with a +% shaded patch around it. Ths sort of plot is often used to indicate +% uncertainty intervals or error bounds around a line. +% +%% Getting started +% +% *Prerequisites* +% +% This function requires Matlab R14 or later. +% +% *Downloading and installation* +% +% This code can be downloaded from <https://github.com/kakearney/boundedline-pkg/ Github> +% or the +% <http://www.mathworks.com/matlabcentral/fileexchange/27485-boundedline-m +% MatlabCentral File Exchange>. The File Exchange entry is updated daily +% from the GitHub repository. +% +% *Matlab Search Path* +% +% The following folders need to be added to your Matlab Search path (via +% |addpath|, |pathtool|, etc.): +% +% boundedline-pkg/Inpaint_nans +% boundedline-pkg/boundedline +% boundedline-pkg/catuneven +% boundedline-pkg/singlepatch + +%% Syntax +% +% |boundedline(x, y, b)| plots a line with coordinates given by +% |x| and |y|, surrounded by a patch extending a certain distance |b| +% above/below that line. The dimensions of the |x|, |y|, and |b| arrays +% can vary to allow for multiple lines to be plotted at once, and for +% patch bounds to be either constant or varying along the length of the +% line. See function header help for full details of these variations. +% +% |boundedline(..., 'alpha')| renders the bounded area patch using a +% partially-transparent patch the same color as the corresponding line(s). +% If not included, the bounded area will use a fully-opaque patch in a +% lighter shade of the corresponding line color. +% +% |boundedline(..., 'transparency', transp)| indicates the +% tranparency or intensity of the bounds patch, using a scalar between 0 +% and 1. Default is 0.2. +% +% |boundedline(..., 'orientation', orient)| indicates the orientation of +% the bounds. Orientation can be either |'vert'| for vertical (y-direction) +% bounds, or |'horiz'| for horizontal (x-direction) bounds. Default is +% |'vert'|. +% +% |boundedline(..., 'nan', nanflag)| indicates how the bounds patch should +% handle NaNs in the line coordinates or bounds values. Options are +% |'fill'|, to smooth over the gap using neighboring values, |'gap'| to +% leave a blank space in the patch at those points, or |'remove'| to drop +% the NaN-points entirely, leading to linear interpolation of the gap in +% the patch. See examples below for more details on these options. +% +% |boundedline(..., 'cmap', cmap)| colors the lines (in order of plotting) +% acording to the colors in this n x 3 colormap array, overriding any +% linespec or default colors. +% +% |boundedline(..., ax)| plots the bounded line to the axis indicated by +% handle |ax|. If not included, the current axis is used. +% +% |[hl, hp] = boundedline(...)| returns the handles the resulting line +% and patch object(s). +% +% |hout = outlinebounds(hl, hp)| adds an outline to the bounds patch +% generated by |boundedline|, returning the handle of the resulting line +% object in |hout|. +% +% Full details of all input and output variables for both functions can be +% accessed via the |help| function. + +%% Example 1: Plotting lines using various syntax options +% +% This example builds the 4-panel example image used on the MatlabCentral +% File Exchange, which shows several different methods for supplying line +% coordinates, bounds coordinates, and shading options. +% +% The first axis plots two lines using the LineSpec option for input, which +% allows yoy to set line color, line color, and marker type for each line. +% The bounds on the first line vary over x, while the bounds on the second +% line are constant for all x. An outline is added to the bounds so the +% overlapping region can be seen more clearly. + +x = linspace(0, 2*pi, 50); +y1 = sin(x); +y2 = cos(x); +e1 = rand(size(y1))*.5+.5; +e2 = [.25 .5]; + +ax(1) = subplot(2,2,1); +[l,p] = boundedline(x, y1, e1, '-b*', x, y2, e2, '--ro'); +outlinebounds(l,p); +title('Opaque bounds, with outline'); +axis tight; + +%% +% For our second axis, we use the same 2 lines, and this time assign +% x-varying bounds to both lines. Rather than using the LineSpec syntax, +% this example uses the default color order to assign the colors of the +% lines and patches. I also turn on the |'alpha'| option, which renders +% the patch wit partial transparency. + +ax(2) = subplot(2,2,2); +boundedline(x, [y1;y2], rand(length(y1),2,2)*.5+.5, 'alpha'); +title('Transparent bounds'); +axis tight; + +%% +% The bounds can also be assigned to a horizontal orientation, for a case +% where the x-axis represents the dependent variable. In this case, the +% scalar error bound value applies to both lines and both sides of the +% lines. + +ax(3) = subplot(2,2,3); +boundedline([y1;y2], x, e1(1), 'orientation', 'horiz') +title('Horizontal bounds'); +axis tight; + +%% +% Rather than use a LineSpec or the default color order, a colormap array +% can be used to assign colors. In this case, increasingly-narrower bounds +% are added on top of the same line. + +ax(4) = subplot(2,2,4); +boundedline(x, repmat(y1, 4,1), permute(0.5:-0.1:0.2, [3 1 2]), ... + 'cmap', cool(4), ... + 'transparency', 0.5); +title('Multiple bounds using colormap'); + +set(ax([1 2 4]), 'xlim', [0 2*pi]); +set(ax(3), 'ylim', [0 2*pi]); +axis tight; + +%% Example 2: Filling gaps +% +% If you plot a line with one or more NaNs in either the |x| or |y| vector, +% the NaN location is rendered as a missing marker with a gap in the line. +% However, the |patch| command does not handle NaNs gracefully; it simply +% fails to show the patch at all if any of the coordinates include NaNs. +% +% Because of this, the expected behavior of the patch part of boundedline +% when confronted with a NaN in either the bounds array (|b|) or the +% x/y-coordinates of the line (which are used to calculate the patch +% coordinates) is ambiguous. I offer a few options. +% +% Before I demonstrate the options, I'll create a dataset that has a few +% different types of gaps: + +x = linspace(0, 2*pi, 50); +y = sin(x); +b = [ones(size(y))*0.2; rand(size(y))*.5+.5]'; + +y(10) = NaN; % NaN in the line but not bounds +b(20,1) = NaN; % NaN in lower bound but not line +b(30,2) = NaN; % NaN in upper bound but not line +b(40,:) = NaN; % NaN in both sides of bound but not line + +%% +% Here's what that looks like in an errorbar plot. + +figure; +he = errorbar(x,y,b(:,1), b(:,2), '-bo'); + + +line([x([10 20 30 40]); x([10 20 30 40])], [ones(1,4)*-2;ones(1,4)*2], ... + 'color', ones(1,3)*0.5, 'linestyle', ':'); +text(x(10), sin(x(10))-0.2, {'\uparrow','Line','gap'}, 'vert', 'top', 'horiz', 'center'); +text(x(20), sin(x(20))-0.2, {'\uparrow','Lower','bound','gap'}, 'vert', 'top', 'horiz', 'center'); +text(x(30), sin(x(30))-0.2, {'\uparrow','Upper','bound','gap'}, 'vert', 'top', 'horiz', 'center'); +text(x(40), sin(x(40))-0.2, {'\uparrow','Two-sided','bound','gap'}, 'vert', 'top', 'horiz', 'center'); + +axis tight equal; + +%% +% The default method for dealing with NaNs in boundedline is to leave the +% gap in the line, but smooth over the gap in the bounds based on the +% neighboring points. This option can be nice if you only have one or two +% missing points, and you're not interested in emphasizing those gaps in +% your plot: + +delete(he); +[hl,hp] = boundedline(x,y,b,'-bo', 'nan', 'fill'); +ho = outlinebounds(hl,hp); +set(ho, 'linestyle', ':', 'color', 'r', 'marker', '.'); + +%% +% I've added bounds outlines in a contrasting color so you can see how I'm +% handling individual points. +% +% The second option leaves a full gap in the patch for any NaN. I +% considered allowing one-sided gaps, but couldn't think of a good way to +% distinguish a gap from a zero-valued bound. I'm open to suggestions if +% you have any (email me). + +delete([hl hp ho]); +[hl,hp] = boundedline(x,y,b,'-bo', 'nan', 'gap'); +ho = outlinebounds(hl,hp); +set(ho, 'linestyle', ':', 'color', 'r', 'marker', '.'); + +%% +% The final option removes points from the patch that are NaNs. The visual +% result is very similar to the fill option, but the missing points are +% apparent if you plot the bounds outlines. + +delete([hl hp ho]); +[hl,hp] = boundedline(x,y,b,'-bo', 'nan', 'remove'); +ho = outlinebounds(hl,hp); +set(ho, 'linestyle', ':', 'color', 'r', 'marker', '.'); + + +%% Contributions +% +% Community contributions to this package are welcome! +% +% To report bugs, please submit +% <https://github.com/kakearney/boundedline-pkg/issues an issue> on GitHub and +% include: +% +% * your operating system +% * your version of Matlab and all relevant toolboxes (type |ver| at the Matlab command line to get this info) +% * code/data to reproduce the error or buggy behavior, and the full text of any error messages received +% +% Please also feel free to submit enhancement requests, or to send pull +% requests (via GitHub) for bug fixes or new features. +% +% I do monitor the MatlabCentral FileExchange entry for any issues raised +% in the comments, but would prefer to track issues on GitHub. +% +