Combine the legends of shaded error and solid line mean

legend, matlab

Solution

There is a direct general way to control legends. You can simply choose not to display line entries by fetching their `'Annotation'` property and setting the `'IconDisplayStyle'` to `'off'`.

Also, in order to use chadsgilbert's solution, you need to collect each single patch handle from every loop iteration. I refactored your code a bit, such that it would work with both solutions.

% Refactoring you example (can be fully vectorized)
figure
axesh  = axes('next','add'); % equivalent to hold on
nZones = 4;
nPts   = 10;
clr    = {'r', 'b', 'g', 'm', 'y', 'c'};
X      = randi(10, nPts, nZones);
Y      = randi(10, nPts, nZones);
XError = rand(nPts, nZones);

% Preallocate handles 
hl = zeros(nZones,1);
hp = zeros(nZones,1);
% LOOP
for ii = 1:nZones
    [hl(ii), hp(ii)] = boundedline(X(:, ii), Y(:, ii), XError(:, ii),...
        ['-', clr{ii}], 'transparency', 0.15, 'orientation', 'horiz');
end

The simplest method as shown by chadsgilbert:

% Create legend entries as a nZones x 8 char array of the format 'Zone #01',...
TagAx  = reshape(sprintf('Zone #%02d',1:nZones),8,nZones)'
legend(hp,TagAx)

... or for general more complex manipulations, set the legend display properties of the graphic objects:

% Do not display lines in the legend
hAnn   = cell2mat(get(hl,'Annotation'));
hLegEn = cell2mat(get(hAnn,'LegendInformation'));
set(hLegEn,'IconDisplayStyle','off')

% Add legend
legend(TagAx);

Problem

I am using this FEX entry to plot the horizontal shaded error bars for a variable plotted on the X-axis. This variable is plotted in different regions/zones and, therefore, there are 3 shaded error bars for 3 zones. I would like to combine the legends of the error bars (shaded region) as well as the mean (solid line) of any zone into a single legend represented by a solid line (or solid line inside a patch) of the same color as the zone. THE WAY MY CODE WORKS FOR PLOTTING: A synthetic example of the way I am plotting is shown below ``` fh = figure(); axesh = axes('Parent', fh); nZones = 4; nPts = 10; X = nan*ones(nPts, nZones); Y = nan*ones(nPts, nZones); XError = nan*ones(10, 4); clr = {'r', 'b', 'g', 'm', 'y', 'c'}; for iZone = 1:nZones X(:, iZone) = randi(10, nPts, 1); Y(:, iZone) = randi(10, nPts, 1); XError(:, iZone) = rand(nPts, 1); % Append Legend Entries/Tags if iZone == 1 TagAx = {['Zone # ', num2str(iZone)]}; else TagAx = [TagAx, {['Zone # ', num2str(iZone)]}]; end hold(axesh, 'on') [hLine, hPatch] = boundedline(X(:, iZone), Y(:, iZone), XError(:, iZone),... strcat('-', clr{iZone}), axesh, 'transparency', 0.15,... 'orientation', 'horiz'); legend(TagAx); xlabel(axesh, 'X', 'Fontweight', 'Bold'); ylabel(axesh, 'Y', 'Fontweight', 'Bold'); title(axesh, 'Error bars in X', 'Fontweight', 'Bold'); end ``` THE WAY LEGENDS ARE SHOWING-UP CURRENTLY: WHAT I HAVE TRIED: As someone suggested in the comment section of that file's FEX page to add the following code after line 314 in boundedline code. ``` set(get(get(hp(iln),'Annotation'),'LegendInformation'),'IconDisplayStyle','off'); ``` However, on doing that I get this error: The name 'Annotation' is not an accessible property for an instance of class 'root'. EDIT: The first two answers suggested accessing the legend handles of the patch and line which are returned as output the by the function `boundedline`. I tried that but the problem is still not solved as the legend entries are still not consistent with the zones.

Original source