MATLAB: Annotation box left corner position

annotation;left corner positionplot

Hi all
I have created a figure divided to 16 subplots using the commands:
hf = figure('units','normalized','outerposition',[0 0 0.5 1]); %%To adjust the aspect ratio 1:2
ha = tight_subplot(4,4,[0.045 0.025],0.05,[0.057 0.01]);%%Create the customized subplots.
ha = reshape(ha',4,4); %%ha(i,j) means subplot in column i and row j.
%%Rest of the code ...
axes(ha(i,j));
%%4 plots in every subplots
pbaspect([1 1 1]) %%To make each subplot square shape.
dim = [0,0,0.5,0.5];
annotation(hf,'textbox',dim,'String',LEGEND(5:8),'FitBoxToText','on');
My confusion is that why the specified dim above place the annotation box where it is depicted in the attached picture. If that is the position of the left corner, then what would be the actual position of the real left corner of the attached picture? My goal is to calculate the left corner position of annotation boxes programmatically and place one box in each subplot.
Thank you!

Best Answer

A few things are happening here. First, by default, the alignment of the text in an annotation text box is in the upper right corner. That positioning is done before the box is trimmed to the text, which leaves the text floating pretty far from the desired location. You can change this easily by adjusting the vertical alignment.
hf = figure;
for ia = 1:4
ha(ia) = subplot(2,2,ia);
end
pos = get(ha, 'position');
dim = cellfun(@(x) x.*[1 1 0.5 0.5], pos, 'uni',0);
annotation(hf, 'textbox', dim{1}, 'String', 'test 1');
annotation(hf, 'textbox', dim{2}, 'String', 'test 2', 'FitBoxToText','on');
annotation(hf, 'textbox', dim{3}, 'String', 'test 3', 'verticalalignment', 'bottom');
annotation(hf, 'textbox', dim{4}, 'String', 'test 4', 'FitBoxToText','on', 'verticalalignment', 'bottom');
The second issue has to do with the positions of the axes themselves. You'll notice that even when you fix the alignment issue, the horizontal location of the annotations overlap with the axis lines:
hf = figure;
for ia = 1:4
ha(ia) = subplot(2,2,ia);
end
arrayfun(@(x) pbaspect(x, [1 1 1]), ha);
drawnow;
pos = get(ha, 'position');
dim = cellfun(@(x) x.*[1 1 0.5 0.5], pos, 'uni',0);
for ia = 1:4
annotation(hf, 'textbox', dim{ia}, 'String', num2str(ia,'test%d'), 'vert', 'bottom', 'FitBoxToText','on');
end
This is because the axis position reflects the full potential position of the axis, rather than the space actually taken up once data aspect and plot box ratios are adjusted. I wrote a function, called plotboxpos.m, that calculates the actual space taken up by a 2D axis. If you substitute that in place of position, you can now align your annotation boxes where you want them:
hf = figure;
for ia = 1:4
ha(ia) = subplot(2,2,ia);
end
arrayfun(@(x) pbaspect(x, [1 1 1]), ha);
drawnow;
pos = arrayfun(@plotboxpos, ha, 'uni', 0);
dim = cellfun(@(x) x.*[1 1 0.5 0.5], pos, 'uni',0);
for ia = 1:4
annotation(hf, 'textbox', dim{ia}, 'String', num2str(ia,'test%d'), 'vert', 'bottom', 'FitBoxToText','on');
end