Matlab Live Scripts displaying figures in seemingly random order when multiple code blocks with subplots are used
61 次查看(过去 30 天)
显示 更早的评论
I am working in a Live Script where I am trying to align signals within different data sets and plot the results for each set. This is in a long script with many previous figures. The signal alignment/plotting code is as follows:
% for dataset 1
d1s1_aligned = alignsignals(d1s1, d1s2);
figure
ax1(1) = subplot(2,1,1);
plot(d1s1_aligned)
grid on
title('s1 aligned')
axis tight
ax1(2) = subplot(2,1,2);
plot(d1s2)
grid on
title('s2')
axis tight
linkaxes(ax1, 'xy')
This is for the first data set (as denoted by d1). If I only try to do this for one data set everything works fine, but I want to repeat this code block multiple times for d2, d3, etc. If, for instance, I add this block underneath:
% for dataset 2
d2s1_aligned = alignsignals(d2s1, d2s2);
figure
ax2(1) = subplot(2,1,1);
plot(d2s1_aligned)
grid on
title('d2s1 aligned')
axis tight
ax2(2) = subplot(2,1,2);
plot(d2s2)
grid on
title('d2s2')
axis tight
linkaxes(ax2, 'xy')
(the same code but d1 -> d2, ax1 -> ax2) all figures in the document end up being rendered at the bottom, out of order, and the two code blocks get merged. It seems maybe live scripts fail when there are multiple subplots in a script? Any advice would be much appreciated.
1 个评论
Emilie Herpain
2022-10-23
For me, what worked is to add the command 'close all' before a new figure that I wanted to generate.
回答(2 个)
Walter Roberson
2021-2-10
Because Live Script renders changes in-line, it postpones rendering until one of the following occurs:
- the axes is cleared or deleted (in which case the content immediately prior to deletion is displayed); or
- there is a return to the command line (such as the end of the Live Script -- but also because of debugging.)
Notice that I did not say "or figure() is called". Regular (non-Live) scripts update graphics when drawnow() or pause() or uiwait() or waitfor() or figure() are called, or the command line is returned to, but the same rules are not followed for Live Script. That is because you might have later statements in your code that switch back to the original figure and draw more in the figure.
figure(1)
plot(rand(1,20))
figure(2)
plot(randn(1,20))
cla() %figure 2 will draw at this point
figure(1)
hold on
plot(rand(1,20).^2);
%figure 1 draws because you reached the end of the script
Diaa
2021-12-28
As a workaround, you can use this MATLAB mechanism in your favor by creating a duplicate dummy figure then delete it to show the intended contents at your specified code location
dummyFig = figure;
copyobj(<handle of some axes in the intended parent figure >, dummyFig);
clf(dummyFig)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Subplots 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!