Matlab – Change the size of a fill sample in Matlab legend

MATLABplot

I'm creating a plot in matlab that includes some lines, as well as a fill. For example,

fill([0 1 1], [0 1 0], [.9 .9 .9]);
plot(rand(5, 1), 'b');
plot(rand(5, 1), 'r');
plot(rand(5, 1), 'g');
legend('fill', 'line one', 'line two', 'line three');

I can change the length of the sample lines in the legend with:

f = findobj('type', 'line');
set(f(2), 'XData', [.2, .3]); % Changes line three
set(f(4), 'XData', [.2, .3]); % Changes line two
set(f(6), 'XData', [.2, .3]); % Changes line one

But this method doesn't seem to work for the fill. How do I change the size of the fill sample in the legend?

Best Answer

fill([0 1 1], [0 1 0], [.9 .9 .9]); hold on
plot(rand(5, 1), 'b');
plot(rand(5, 1), 'r');
plot(rand(5, 1), 'g'); hold off
h = legend('fill', 'line one', 'line two', 'line three');

%# find handles of lines inside legend that have a non-empty tag
hLegendLines = findobj(h, 'type', 'line', '-and', '-regexp','Tag','[^'']');
set(hLegendLines, 'XData', [.2, .3])

%# find handle of patch inside legend
hLegendPatch = findobj(h, 'type', 'patch');
set(hLegendPatch, 'XData', [.2, .2, .3, .3])

EDIT: (response to comments)

You can manipulating the size of the legend by setting the Position property. However, it seems that the legend fits its content as tight as possible by default, so you can make it bigger, but not smaller (try resizing it with the mouse):

p = get(h,'Position'); p(3)=0.1;
set(h, 'Position',p);

alt text

Another way is to reduce the font size used for the labels:

h = legend('fill', 'line one', 'line two', 'line three')
set(h, 'FontSize',6);    %# do this before changing the other stuff

alt text