Hold on issue for subplots (2024)

128 views (last 30 days)

Show older comments

Gulfer Ozcetin on 7 Sep 2021

  • Link

    Direct link to this question

    https://www.mathworks.com/matlabcentral/answers/1448364-hold-on-issue-for-subplots

  • Link

    Direct link to this question

    https://www.mathworks.com/matlabcentral/answers/1448364-hold-on-issue-for-subplots

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

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

  • Link

    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

  • Link

    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

  • Link

    Direct link to this answer

    https://www.mathworks.com/matlabcentral/answers/1448364-hold-on-issue-for-subplots#answer_782664

  • Link

    Direct link to this answer

    https://www.mathworks.com/matlabcentral/answers/1448364-hold-on-issue-for-subplots#answer_782664

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))

Hold on issue for subplots (5)

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)

Hold on issue for subplots (6)

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)

Hold on issue for subplots (7)

3 Comments

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

  • Link

    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

  • Link

    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

  • Link

    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

  • Link

    Direct link to this answer

    https://www.mathworks.com/matlabcentral/answers/1448364-hold-on-issue-for-subplots#answer_782679

  • Link

    Direct link to this answer

    https://www.mathworks.com/matlabcentral/answers/1448364-hold-on-issue-for-subplots#answer_782679

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

Hold on issue for subplots (12)

1 Comment

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

  • Link

    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.


Hold on issue for subplots (14)

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

Hold on issue for subplots (2024)
Top Articles
Latest Posts
Recommended Articles
Article information

Author: Sen. Emmett Berge

Last Updated:

Views: 5945

Rating: 5 / 5 (80 voted)

Reviews: 87% of readers found this page helpful

Author information

Name: Sen. Emmett Berge

Birthday: 1993-06-17

Address: 787 Elvis Divide, Port Brice, OH 24507-6802

Phone: +9779049645255

Job: Senior Healthcare Specialist

Hobby: Cycling, Model building, Kitesurfing, Origami, Lapidary, Dance, Basketball

Introduction: My name is Sen. Emmett Berge, I am a funny, vast, charming, courageous, enthusiastic, jolly, famous person who loves writing and wants to share my knowledge and understanding with you.