Vertical subplot dimensions do not match

13 visualizaciones (últimos 30 días)
Luca Romagnuolo
Luca Romagnuolo el 9 de Feb. de 2024
Comentada: Luca Romagnuolo el 9 de Feb. de 2024
Hi! I'm trying to create a figure with two subplots disposed vertically, which have the same dimension along the xaxis. To do that, I saved the subplot axes as variables "ax1" and "ax2", then I added the following line in my program, at the end of the generation of the subplots:
ax2.Position(3) = ax1.Position(3);
Weird thing happens: when I launch the previous command after the code has finished running, it works properly and it changes the second plot x dimension in order to be equal to the first one, as required. BUT if I simply add the line at the end of the code and I run the code all toghether, it completely messes up the x dimension of the second plot. Furthermore, if I add a pause before the command, it works properly.
It seems that in order to work correctly, the command needs to be applied after the figure has been created, but I don't understand why. Is there a bug in Matlab subplot creation? My Matlab version is R2023b Update 3 (23.2.0.2409890).
Here is an example (pause at the penultimate line is commented, to replicate the issue):
close all; clear; clc;
x = 0:0.1:100;
xmin = 0; xmax = 100; xstep = 5;
y1 = sin(x);
y2 = cos(x);
y3 = (sin(x)).^2;
y4 = (cos(x)).^2;
ymin = -1; ymax = 1; ystep = 0.2;
fig = figure("Units","normalized","Position",[0.1 0.1 0.5 0.75]);
ax1 = subplot(2,1,1);
plot(x,y1,'b-','DisplayName','y1','LineWidth',1)
ylabel('ylabel\_1L'); ylim([ymin ymax]); yticks(ymin:ystep:ymax);
yyaxis right;
plot(x,y2,'k--','DisplayName','y2','LineWidth',1);
ylabel('ylabel\_1R'); ylim([ymin ymax]); yticks(ymin:ystep:ymax);
xlabel('xlabel'); xlim([xmin xmax]); xticks(xmin:xstep:xmax); grid on
ax1.YAxis(1).Color = 'b'; ax1.YAxis(2).Color = 'k'; ax1.GridColorMode = "manual";
legend('Location','eastoutside'); title('graph 1')
ax2 = subplot(2,1,2);
hold on
plot(x,y3,'b-','DisplayName','y3','LineWidth',1)
plot(x,ones(length(x),1)*mean(y3),'-.','Color',[0 0 0.7],'DisplayName','Avg. y3')
ylabel('ylabel\_2L'); ylim([ymin ymax]); yticks(ymin:ystep:ymax);
yyaxis right;
plot(x,y4,'k--','DisplayName','Height');
ylabel('ylabel\_2R'); ylim([ymin ymax]); yticks(ymin:ystep:ymax);
xlabel('xlabel'); xlim([xmin xmax]); xticks(xmin:xstep:xmax); grid on
ax2.YAxis(1).Color = 'r'; ax2.YAxis(2).Color = 'k'; ax2.GridColorMode = "manual";
legend('Location','eastoutside'); title('graph 2')
annotation('textbox',[0.85 0.13 0.12 0.06],'BackgroundColor','w','String',sprintf('annotation 1\nannotation 2\nannotation 3'))
sgtitle('General title')
% pause(0.1)
ax2.Position(3) = ax1.Position(3);

Respuesta aceptada

Matt J
Matt J el 9 de Feb. de 2024
Editada: Matt J el 9 de Feb. de 2024
No, it's not a bug. Graphics commands are not executed synchronously with the rest of Matlab. So, you cannot be sure the ultimate value of ax1.Position will have gone into effect at the time that last line is issued. Rather than using pause() to force graphics to update, though, it would be more usual to use drawnow:
ax1 = subplot(2,1,1);
...
drawnow
ax2 = subplot(2,1,2);
...
drawnow
ax2.Position(3) = ax1.Position(3);
  3 comentarios
Matt J
Matt J el 9 de Feb. de 2024
Editada: Matt J el 9 de Feb. de 2024
If you mean replacing the last line with something like this,
v=0.6438;
ax2.Position(3) = v; ax2.Position(3) = v;
then yes, that should work. Although again, if you have additional code following what you've shown us, these assignments may not be reflected in the plot right away.
Luca Romagnuolo
Luca Romagnuolo el 9 de Feb. de 2024
yes, exactly what I meant. okok, all clear, thanks again!

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Mathematics en Help Center y File Exchange.

Productos


Versión

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by