MATLAB: Legend title won’t display correctly.

figurelegendMATLABsubplottitle

Dear all,
I have been trying to make a figure with an odd number of subplots and the last subplot space would be dedicated to the legend.
This is what I came up with using Matlab 2019a:
% Construct a figure with subplots and data
figure('WindowState', 'maximized');
subplot(2,2,1);
line1 = plot(1:10,rand(1,10),'b', 'DisplayName', 'Data 1');
title('Axes 1');
subplot(2,2,2);
line2 = plot(1:10,rand(1,10),'g', 'DisplayName', 'Data 2');
title('Axes 2');
subplot(2,2,3);
line3 = plot(1:10,rand(1,10),'r', 'DisplayName', 'Data 3');
title('Axes 3');
sp = subplot(2,2,4);
% line4 = plot(1:10,rand(1,10),'y');
% title('Axes 4');
% Construct a Legend with the data from the sub-plots
plot(0,0, 0,0, 0,0, 0,0)
axis off
[lg, icons] = legend({'Data Axes 1','Data Axes 2','Data Axes 3'},'FontSize',24);
% Find the 'line' objects
icons = findobj(icons,'Type','line');
set(icons,'LineWidth', 2);
% Find lines that use a marker
icons = findobj(icons,'Marker','none','-xor');
% Resize the marker in the legend
set(icons,'MarkerSize',20);
a = get(sp,'position');
c = get(lg, 'position');
% Programatically move the Legend
newPosition = [a(1)-c(3)/2+a(3)/2 a(2)-c(4)/2+a(3)/2 c(3) c(4)];
newUnits = 'normalized';
lg.Title.Visible = 'on';
title(lg,'Particle sinking speed');
set(lg,'Position', newPosition,'Units', newUnits);
I get a string of text on the figure but it is displaying in a rather unespected way:
FB example.png
I tried using the plot editor, same behaviour.
I was expecting someting more like this:
FB example.png
Code for the second figure:
figure
line1 = plot(1:10,rand(1,10),'b', 'DisplayName', 'Data 1');
title('Axes 1');
lg = legend
title(lg, "my title, and it can be long")
What am I doing wrong?

Best Answer

OK, I see I overlooked the needed (albeit hidden) property that needed most to get where you want to go...
Try exploring from this point:
figure
hL=plot(0,0, 0,0, 0,0); % three dummy lines to legend something
axis off % don't show the axis
hLg=legend({'Data Axes 1','Data Axes 2','Data Axes 3'},'FontSize',24); % so create the base legend object
hLgT=title(hLg, "My title, and it can be long"); % title, save handle to mung o
hLgAx=hLg.Axes; % retrieve the axes underlying the legend (there is still one there)
hLgLn=findobj(hLgAx,'Type','Line'); % and the handles for the lines on that axes
set(hLgLn,'LineWidth',2) % set their width property
Thanks to Yair Altman's tool for finding the hidden properties underneath the legend...and, of course, since is all undocumented, who know how long will be before TMW changes something else altho wouldn't expect the axes to go away.
This produces a full-size figure, of course, I didn't mess with the position/size, etc., but everything should work on that axes as expected; just more complicated to get access than needs must be. Why TMW is so bent on making things more rather than less difficult is hard to comprehend.
ADDENDUM
ADDENDUM 2:
There's another hidden property PlotChildren that returns the line handles directly without having to go "handle diving" under the axis altho they're in the opposite order in the two arrays for some reason.
> hLgLn=findobj(hLgAx,'Type','Line')
hLgLn =
3×1 Line array:
Line (Data Axes 3)
Line (Data Axes 2)
Line (Data Axes 1)
>> hLg.PlotChildren
ans =
3×1 Line array:
Line (Data Axes 1)
Line (Data Axes 2)
Line (Data Axes 3)
>> all(flip(hLgLn)==hLg.PlotChildren)
ans =
logical
1
>>