MATLAB: Grouping Plot and Fill in Same legend object

figure handlefillhggrouplegendplot

I have two plots of some mean value (hh) and two fill (he) plots of the confidence intervals for the associated mean values. I would like to be able to create only two legend entries instead of four so that the legend object is a combination of the plot and fill objects (Fill overlayed by the plot).
I've tried using hggroup to set parent figure handles to the plot and fill objects but I cannot get the legend to display the way I would like.
h1 = hggroup;
h2 = hggroup;
set(hh1, 'Parent', h1);
set(he3, 'Parent', h1);
set(hh2, 'Parent', h2);
set(he4, 'Parent', h2);
Is there a way to have overlayed legend entries for two different figure objects?

Best Answer

  • Okay, I hope, this helps you:
    % -- generate some dummy data
    t = linspace(0,1);
    s1 = sin(5*t);
    s2 = 3-cos(5*t);
    s3 = s1.*s2;
    Fx = [t fliplr(t)];
    Fy1 = [s1+1 fliplr(s1)-1];
    Fy2 = [s2+.5 fliplr(s2)-.1];
    Fy3 = [s3+.1 fliplr(s3)-.5];
    % ---
    % -- draw your data, save all handles
    hf = fill(Fx,Fy1,'g',Fx,Fy2,'y',Fx,Fy3,'m');
    hold on
    hl = plot(t,s1,'r',t,s2,'b',t,s3,'c');
    hleg = legend(hf,'Sin','Cos','Sin*Cos');
    hold off
    % The children of the legend axes are the little graphics, and the labels
    hc = flipud(get(hleg,'Children'));
    % For some reason, Matlab lists the legend entries in reverse order in the
    % handle of the Children.
    % Now we draw a line of the appropriate color over every patch in the
    % legend
    for ii=1:3
    xp = get(hc(ii*2),'XData');
    yp = get(hc(ii*2),'YData');
    line(xp(2:3)+[-1 ;1]*(xp(3)-xp(2))/50,... the line will be a little longer than the box
    [1 1]*(yp(2)+yp(1))/2,... and sit right in the center vertically
    'Color',get(hl(ii),'Color'),... have the color of the corresponding line
    'Parent',hleg,... and be drawn into the legend axes
    'LineWidth',1);
    end
    Report back here if you need any help or explanation!