Grouping Plot and Fill in Same legend object

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?

2 comentarios

Jonathan Epperl
Jonathan Epperl el 9 de Abr. de 2013
To clarify: You want the legend to display a little piece of a line and a filled area for each of your 2 data series?
curoi
curoi el 9 de Abr. de 2013
Yeah, so that the patch shows up with the line overlayed as a single legend entry.

Iniciar sesión para comentar.

 Respuesta aceptada

Jonathan Epperl
Jonathan Epperl el 10 de Abr. de 2013
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!

3 comentarios

Chad Greene
Chad Greene el 28 de Feb. de 2017
Brilliant! Four years later and your answer is still helping people. Thanks Jonathan.
liomsi liomsi
liomsi liomsi el 19 de Mayo de 2020
Editada: liomsi liomsi el 19 de Mayo de 2020
with your exemple, get(hLegend,'Children') returns a 0×0 empty GraphicsPlaceholder array. Any idea why? I'm on Matlab R2017a.
Arthur Vieira
Arthur Vieira el 16 de Jun. de 2021
Same in R2020a. 'Children: [0×0 GraphicsPlaceholder]'

Iniciar sesión para comentar.

Más respuestas (0)

Preguntada:

el 9 de Abr. de 2013

Comentada:

el 16 de Jun. de 2021

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by