128 views (last 30 days)
Show older comments
Gulfer Ozcetin on 7 Sep 2021
Commented: Gulfer Ozcetin on 9 Sep 2021
Accepted Answer: Dave B
Open in MATLAB Online
Hello,
I had created 3 figures consisting of subplots: 4x2; 6x2 and 4x2 and saved them in 3 seperate .fig files, no problem on this step. The thing is, I need to use those saved figures again and add other plots without deleting the existing ones (directly on existing data, imagine you have a sine wave on plot 4,2,1 and then you are adding a cosine wave; now you have 2 waves inside this plot). For the figures sized 4x2; I do not have any issues but for the figure sized 6x2, whenever I try to add another graph, the existing one goes away. Actually all the settings are going away (title, axes names, etc...) and the new graphs are added on a blank subplot. Basically "hold on" does not work even I did everything the same as I did for the other figures. I researched about this issue and it is mentioned that "SUBPLOT clears the axes when called unless the new subplot properties (such as 'position') match the original subplot properties". Eventually I tried to create the new figure with the exact same graphs and properties, the issue persists. The piece of code that works on the first figure but not for the second is: (By the way I am using Matlab 2013b, so not every function is available for me...)
numX = open(name_figX_final);
figure(numX); pause(2); hold on
The code in summary:
while(a<=length(name_signals_array))
if a==1
num1 = open(name_fig1_final);
figure(num1); pause(2); hold on
subplot(421),
plot(wind_list, signals_stats(1,:), '--ro'); set(gca,'XTick',wind_label); hold on
plot(wind_list, signals_stats(2,:), '--r^'); plot(wind_list, signals_stats(3,:), '--rv');
title('Signals421'); xlabel(prop_xlabel); ylabel('rpm'); legend({'min:','max:', 'mean:'},'Location','best')
subplot(422),
plot(wind_list, signals_stats(4,:), '--ro'); % set(gca,'XTick',wind_label);
title('Signals421'); xlabel(prop_xlabel); ylabel('rpm'); legend({'std:'},'Location','best')
elseif a==2
subplot(423);
plot(wind_list, signals_stats(5,:), '--bo'); set(gca,'XTick',wind_label); hold on
plot(wind_list, signals_stats(6,:), '--b^'); plot(wind_list, signals_stats(7,:), '--bv');
title('Signals423'); xlabel(prop_xlabel); ylabel('deg'); legend({'min:','max:', 'mean:'},'Location','best')
subplot(424),
plot(wind_list, signals_stats(8,:), '--bo'); set(gca,'XTick',wind_label);
title('Signals424'); xlabel(prop_xlabel); ylabel('deg'); legend({'std:'},'Location','best')
elseif a==3
subplot(425),
% .....
subplot(426),
% .....
elseif a==4
subplot(427),
% ....
subplot(428),
% ....
savefig(name_fig1);
end
if a==5
num2 = open(name_fig2_final);
figure(num2); pause(2); hold on
subplot(6,2,1)
plot(wind_list, signals_stats(17,:), '--bo'); set(gca,'XTick',wind_label); hold on
plot(wind_list, signals_stats(18,:), '--b^'); plot(wind_list, signals_stats(19,:), '--bv');
title('Signals621'); xlabel(prop_xlabel); ylabel('Nm'); legend({'min:','max:', 'mean:'},'Location','best')
subplot(6,2,2),
plot(wind_list, signals_stats(20,:), '--bo'); set(gca,'XTick',wind_label);
title('Signals622'); xlabel(prop_xlabel); ylabel('Nm'); legend({'std:'},'Location','best')
elseif a==6
subplot(6,2,3)
plot(wind_list, signals_stats(21,:), '--bo'); set(gca,'XTick',wind_label); hold on
plot(wind_list, signals_stats(22,:), '--b^'); plot(wind_list, signals_stats(23,:), '--bv');
title('Signals623'); xlabel(prop_xlabel); ylabel('Nm'); legend({'min:','max:', 'mean:'},'Location','best')
subplot(6,2,4),
plot(wind_list, signals_stats(24,:), '--bo'); set(gca,'XTick',wind_label);
title('Signals624'); xlabel(prop_xlabel); ylabel('Nm'); legend({'std:'},'Location','best')
elseif a==7
subplot(6,2,5)
%...
subplot(6,2,6),
%...
elseif a==8
subplot(6,2,7)
%...
subplot(6,2,8),
%...
elseif a==9
subplot(6,2,9)
%...
subplot(6,2,10),
%...
elseif a==10
subplot(6,2,11)
%...
subplot(6,2,12),
%...
savefig(name_fig2);
end
a=a+1;
end
2 Comments Show NoneHide None
Show NoneHide None
Bjorn Gustavsson on 7 Sep 2021
Direct link to this comment
https://www.mathworks.com/matlabcentral/answers/1448364-hold-on-issue-for-subplots#comment_1724784
Open in MATLAB Online
What I do to avoid these type of problems is to keep the axes-handles of the different subplots and instead of calling subplot again to make one subplot-axes the current I call axes(sph42(1)):
sph42 = subplot(4,2,1);
sph42(2) = subplot(4,2,2);
for i1 = 8:-1:1
sph42(i1) = subplot(4,2,i1)
end
axes(sph42(1))
plot(randn(23))
% etc
If that works with data saved in .fig-format I don't know, but maybe...
HTH
Gulfer Ozcetin on 8 Sep 2021
Direct link to this comment
https://www.mathworks.com/matlabcentral/answers/1448364-hold-on-issue-for-subplots#comment_1726494
Hello @Bjorn Gustavsson, thanks for your answer. But as you already indicated, it is not working with the data saved in a .fig file...
Sign in to comment.
Sign in to answer this question.
Accepted Answer
Dave B on 7 Sep 2021
Edited: Dave B on 8 Sep 2021
Open in MATLAB Online
TLDR: use tiledlayout/nexttile if you have R2019b or later, on older releases you can work around subplot's save/load weirdness with a 'Tag' or other property and findobj.
subplot's behavior can be awkward with saved files, there's no trivial way to save the axes handles.
If you really want to track these axes across saving, you could consider getting the children of the figure:
subplot(1,2,1)
plot(1:10)
subplot(1,2,2)
plot(rand(1,10))
kids = get(gcf,'Children');
hold(kids(2), 'on')
plot(kids(2), rand(1,10))
As you can see, the tricky bit here is determining which axes is which. You could add a 'Tag' or manipulate another property to determine which one you want, or you could look at the Position property and decode out the location in the grid:
clf
ax=subplot(1,2,1);
plot(1:10)
ax.Tag='1'; % If you set the Tag to '1' on the axes, that information will be saved and gives you a way to find this axes after loading (without calling 'subplot()' which may replace your axes)
ax=subplot(1,2,2);
plot(rand(1,10))
ax.Tag='2';
ax1 = findobj(gcf, 'Tag', '1'); % findobj provides a way to find the axes with the Tag '1'
hold(ax1, 'on')
plot(ax1, ones(1,10))
ax2 = findobj(gcf, 'Tag', '2');
hold(ax2, 'on')
plot(ax2, 1:10)
If you're using R2019b or later though, you're far better off using nexttile. nexttile saves and loads much more smoothly, and you can get a handle to an axes very similarly to how you'd do that with subplot:
clf
tiledlayout(1,2)
nexttile(1); % tiledlayout(1,2) + nexttile(1) is sort of like subplot(1,2,1), but tiledlayout is more modern, works better with saving among other things
plot(1:10);
nexttile(2);
plot(rand(1,10))
% Unlike the subplot equivalent, this should work after saving and loading
ax1 = nexttile(1);
hold(ax1,'on')
plot(ax1, rand(1,10))
ax2 = nexttile(2);
hold(ax2,'on')
plot(ax2, 1:10)
3 Comments Show 1 older commentHide 1 older comment
Show 1 older commentHide 1 older comment
Gulfer Ozcetin on 8 Sep 2021
Direct link to this comment
https://www.mathworks.com/matlabcentral/answers/1448364-hold-on-issue-for-subplots#comment_1726529
Hello @Dave B , thank you for your answer. Unfortunately the lines hold(ax1, 'on') and hold(ax2, 'on') is not the terms that supported by Matlab 2013b... I tried your code also with 2020b and it is working well but my code should be run perfectly with the version 2013b. nexttile is not even included, as you already remarked.
Dave B on 8 Sep 2021
Direct link to this comment
https://www.mathworks.com/matlabcentral/answers/1448364-hold-on-issue-for-subplots#comment_1726539
⋮
Open in MATLAB Online
Ah 2013b is a while back. It surprised me at first, as I expected hold to work, but the problem is actually the ax.Tag line, which should be a set( in old releases:
This code worked for me on 2013b:
ax=subplot(1,2,1);
plot(1:10)
set(ax,'Tag','1')
ax=subplot(1,2,2);
plot(rand(1,10))
set(ax,'Tag','2')
hgsave(gcf,'foo.fig')
%%
open('foo.fig')
ax1 = findobj(gcf, 'Tag', '1');
hold(ax1,'on')
plot(ax1, ones(1,10))
ax2 = findobj(gcf, 'Tag', '2');
hold(ax2, 'on')
plot(ax2, 1:10)
Gulfer Ozcetin on 9 Sep 2021
Direct link to this comment
https://www.mathworks.com/matlabcentral/answers/1448364-hold-on-issue-for-subplots#comment_1728234
Thank you very much @Dave B, so far I tried too many things but this literally saved my life!
Sign in to comment.
More Answers (1)
MICHAEL MUTWIRI on 7 Sep 2021
Edited: MICHAEL MUTWIRI on 7 Sep 2021
Open in MATLAB Online
The subplot has a default of replacing old plot when creating a new plot on the same axis. Add the
subplot(abc, 'NextPlot','add') for each subplot case. You also need to hold on after each subplot and hold off before moving to the next subplot
My code contains sample data to demonstrate a figure with subplots can be saved and opened later for additional plots. I have commented out axis labels since I don't your actual data.
Following your while-loop code, you need to have created the two figures and saved them before opening them inside the while loop
Hope your understand and complete the code for if-elseif conditions for a==5 to a==10
name_fig1_final='name_fig1_final.fig';
name_fig2_final='name_fig2_final.fig';
%% prepare some sample data for testing
name_signals_array =1:24;
wind_list = linspace(0,2*pi,100);
signals_stats = ones(30,length(wind_list));
for i=1:size(signals_stats,1)
signals_stats(i,:)=sin(wind_list+i*0.1*pi);
end
%% name_fig1_final: subplot 4x2
num1 = figure;
subplot(4,2,1);z1 = cos(wind_list);plot(wind_list,z1,'r');grid on
subplot(4,2,2);z2 = cos(wind_list);plot(wind_list,z2,'r');grid on
subplot(4,2,3);z3 = cos(wind_list);plot(wind_list,z3,'r');grid on
subplot(4,2,4);z4 = cos(wind_list);plot(wind_list,z4,'r');grid on
subplot(4,2,5);z5 = cos(wind_list);plot(wind_list,z5,'r');grid on
subplot(4,2,6);z6 = cos(wind_list);plot(wind_list,z6,'r');grid on
subplot(4,2,7);z7 = cos(wind_list);plot(wind_list,z7,'r');grid on
subplot(4,2,8);z8 = cos(wind_list);plot(wind_list,z8,'r');grid on
savefig(num1,name_fig1_final)
close(num1)
%% name_fig2_final: subplot 6x2
num2 = figure;
subplot(6,2,1);zz1 = cos(wind_list);plot(wind_list,zz1,'r');grid on
subplot(6,2,2);zz2 = cos(wind_list);plot(wind_list,zz2,'r');grid on
subplot(6,2,3);zz3 = cos(wind_list);plot(wind_list,zz3,'r');grid on
subplot(6,2,4);zz4 = cos(wind_list);plot(wind_list,zz4,'r');grid on
subplot(6,2,5);zz5 = cos(wind_list);plot(wind_list,zz5,'r');grid on
subplot(6,2,6);zz6 = cos(wind_list);plot(wind_list,zz6,'r');grid on
subplot(6,2,7);zz7 = cos(wind_list);plot(wind_list,zz7,'r');grid on
subplot(6,2,8);zz8 = cos(wind_list);plot(wind_list,zz8,'r');grid on
subplot(6,2,9);zz9 = cos(wind_list);plot(wind_list,zz9,'r');grid on
subplot(6,2,10);zz10 = cos(wind_list);plot(wind_list,zz10,'r');grid on
subplot(6,2,11);zz11 = cos(wind_list);plot(wind_list,zz11,'r');grid on
subplot(6,2,12);zz12 = cos(wind_list);plot(wind_list,zz12,'r');grid on
savefig(num2,name_fig2_final)
close(num2)
%
a=1;
while(a<=length(name_signals_array))
if a==1
% at this stage, the figure need to been created and saved before
% trying to open it.
num1 = open(name_fig1_final);
figure(num1); pause(2);
subplot(421,'NextPlot','add'),
hold on
plot(wind_list, signals_stats(1,:), '--b'); %set(gca,'XTick',wind_label);
plot(wind_list, signals_stats(2,:), '--m'); plot(wind_list, signals_stats(3,:), '--g');
title('Signals421');% xlabel(prop_xlabel); ylabel('rpm'); legend({'min:','max:', 'mean:'},'Location','best')
hold off
subplot(422,'NextPlot','add'),
hold on
plot(wind_list, signals_stats(4,:), '--b'); % set(gca,'XTick',wind_label);
title('Signals422'); %xlabel(prop_xlabel); ylabel('rpm'); legend({'std:'},'Location','best')
hold off
elseif a==2
subplot(423, 'NextPlot','add');
hold on
plot(wind_list, signals_stats(5,:), '--b'); %set(gca,'XTick',wind_label); hold on
plot(wind_list, signals_stats(6,:), '--g'); plot(wind_list, signals_stats(7,:), '--c');
title('Signals423'); %xlabel(prop_xlabel); ylabel('deg'); legend({'min:','max:', 'mean:'},'Location','best')
hold off
subplot(424, 'NextPlot','add'),
hold on
plot(wind_list, signals_stats(8,:), '--b'); %set(gca,'XTick',wind_label);
title('Signals424'); %xlabel(prop_xlabel); ylabel('deg'); legend({'std:'},'Location','best')
hold off
elseif a==3
subplot(425, 'NextPlot','add'),
% .....
subplot(426, 'NextPlot','add'),
% .....
elseif a==4
subplot(427, 'NextPlot','add'),
% ....
subplot(428, 'NextPlot','add'),
% ....
%savefig(name_fig1); take this outside the if-elseif conditions
end
savefig(num1,name_fig1_final)
% Edit the code below in a similar fashion to the avove part
% if a==5
% num2 = open(name_fig2_final);
% figure(num2); pause(2); hold on
% subplot(6,2,1)
% plot(wind_list, signals_stats(17,:), '--bo'); set(gca,'XTick',wind_label); hold on
% plot(wind_list, signals_stats(18,:), '--b^'); plot(wind_list, signals_stats(19,:), '--bv');
% title('Signals621'); xlabel(prop_xlabel); ylabel('Nm'); legend({'min:','max:', 'mean:'},'Location','best')
% subplot(6,2,2),
% plot(wind_list, signals_stats(20,:), '--bo'); set(gca,'XTick',wind_label);
% title('Signals622'); xlabel(prop_xlabel); ylabel('Nm'); legend({'std:'},'Location','best')
% elseif a==6
% subplot(6,2,3)
% plot(wind_list, signals_stats(21,:), '--bo'); set(gca,'XTick',wind_label); hold on
% plot(wind_list, signals_stats(22,:), '--b^'); plot(wind_list, signals_stats(23,:), '--bv');
% title('Signals623'); xlabel(prop_xlabel); ylabel('Nm'); legend({'min:','max:', 'mean:'},'Location','best')
% subplot(6,2,4),
% plot(wind_list, signals_stats(24,:), '--bo'); set(gca,'XTick',wind_label);
% title('Signals624'); xlabel(prop_xlabel); ylabel('Nm'); legend({'std:'},'Location','best')
% elseif a==7
% subplot(6,2,5)
% %...
% subplot(6,2,6),
% %...
% elseif a==8
% subplot(6,2,7)
% %...
% subplot(6,2,8),
% %...
% elseif a==9
% subplot(6,2,9)
% %...
% subplot(6,2,10),
% %...
% elseif a==10
% subplot(6,2,11)
% %...
% subplot(6,2,12),
% %...
% savefig(name_fig2);
% end
%fprintf('a = %g\n',a)
a=a+1;
end
1 Comment Show -1 older commentsHide -1 older comments
Show -1 older commentsHide -1 older comments
Gulfer Ozcetin on 8 Sep 2021
Direct link to this comment
https://www.mathworks.com/matlabcentral/answers/1448364-hold-on-issue-for-subplots#comment_1726559
Edited: Gulfer Ozcetin on 8 Sep 2021
Open in MATLAB Online
Hello @MICHAEL MUTWIRI, thank you for your answer and explanation. Yes, I had already had saved .fig files before. But unfortunately expressions like subplot(422,'NextPlot','add') is not supported by Matlab 2013b because I tried your code both with 2020b and 2013b, there was no error with 2020b but I cannot run it with 2013b...
Here is the error I got:
Error using /
Matrix dimensions must agree.
Error in subplot (line 311)
row = (nRows - 1) -
fix((plotId - 1) /
nCols);
Error in subplot_deneme (line 46)
subplot(421,'NextPlot','add'),
Sign in to comment.
Sign in to answer this question.
See Also
Categories
MATLABGraphicsFormatting and AnnotationAxes AppearanceCombine Multiple PlotsSubplots
Find more on Subplots in Help Center and File Exchange
Tags
- hold on
- matlab
- plot
- subplot
- plotting
- figure
- graph
Products
- MATLAB
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- Deutsch
- English
- Français
- United Kingdom(English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)
Contact your local office