Why an annotation is plotted in a different position when the script is run as a whole than when running parts of it separately?

4 views (last 30 days)
When I run a more detailed script as a whole, with the same structure as:
%%%% BLOCK 1
figure();
set(gcf, 'units','normalized','outerposition',[0 0 1 1]); % Maximize figure.
for j=1:3
subplot(4,3,c(j))
for cv = 1:11
plot()
end
subplot(4,3,c(j)+3)
for cv = 1:11
plot()
end
subplot(4,3,c(j)+3)
for cv = 1:11
plot()
end
subplot(4,3,c(j)+6)
for cv = 1:11
plot()
end
subplot(4,3,c(j)+9)
for cv = 1:11
plot()
end
end
subplot(4,3,1); ylabel(
subplot(4,3,2); title(
subplot(4,3,3); title(
subplot(4,3,4); yyaxis left; ylabel(
legend([p(1),p(23),p(12)],{
subplot(4,3,7); ylabel(
subplot(4,3,10); ylabel(
subplot(4,3,11); xlabel(
subplot(4,3,12); xlabel(
%Additional Annotations and text
subplot(4,3,7); sp=get(gca,'Position');
text(
annotation ('arrow',
annotation('line',
subplot(4,3,8);
text(
annotation ('arrow',
annotation('line',
subplot(4,3,9);
text(
annotation ('arrow',
annotation('line',
subplot(4,3,10); sp=get(gca,'Position');
text(
annotation ('arrow',
subplot(4,3,11);
text(
annotation ('arrow',
subplot(4,3,12);
text(
annotation ('arrow', .. ); annotation('line', .. );
%%% BLOCK 2
ax = subplot(4,3,2);
h=findobj(ax,'Type','text','String','ON'); set(h(2), 'Color', [0 1 0])
sp = get(ax, 'position'); %[Ax_xpos, Ax_ypos, Ax_width, Ax_height]
xscale = get(ax, 'xlim' ); %[xmin, xmax]
yscale = get(ax, 'ylim'); %[ymin, ymax]
X_norm = (h(2).Position(1)-xscale(1))/(xscale(2)-xscale(1))*sp(3)+sp(1);
Y_norm = (h(2).Position(2)-yscale(1))/(yscale(2)-yscale(1))*sp(4)+sp(2);
annotation('rectangle',[X_norm sp(2)+sp(4) .1347 .0125],'FaceColor','black','FaceAlpha',1);
%%%
It produces different X_norm and Y_norm and places the rectangle annotation in a different position than if I run BLOCK 1 first and then BLOCK 2 (either by commenting out the block not needed or by copying each block in the command window). Running the script as a whole, places the rectangle in the wrong position. The code should plot the start of the rectangle at the green ON. See attachments to compare differences.
What do I need to modify so I can plot the rectangle in the correct position when running the code as a whole?
  2 Comments
ErikaZ
ErikaZ on 11 Dec 2020
I found a work around using
pause(0.01)
%OR
drawnow
Right before
ax = subplot(4,3,2);
And I can run the whole script and display the rectangle annotation correctly.
However, I would still like to know why is this happening and why
sp = get(ax, 'position');
has different values if the script is run as a whole or by section.
Raunak Gupta
Raunak Gupta on 19 Dec 2020
Edited: Raunak Gupta on 19 Dec 2020
Hi,
The code given in the question looks to have lot of missing parts. It will be helpful for reproducing the issue, if you can add the code which atleast plot the subplots and corresponding axes even if the data is not plotted. Also please mention which MATLAB Release you are using.

Sign in to comment.

Accepted Answer

ErikaZ
ErikaZ on 23 Apr 2021
drawnow
or
pause(0.01)
Solves the display issue

More Answers (0)

Community Treasure Hunt

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

Start Hunting!