How to create figure containing 4 plots with tiledlayout for different values of a parameter?
    7 views (last 30 days)
  
       Show older comments
    
Hello to everyone, 
I'm dealing with a post-processing of large astrodynamics trajectories database and I need to put together 4 figures in one by using tiledlayout matlab function. I want to get 4 plot (one for each value contained inside the array "idx_JC_vec") in one figure and then export it as .pdf file.
Here is my code (sorry for its):
load UHIM_DB   % I reduce the original database to only 4 values of Jacobi constant
load Customized_colors
%Trajectories family selection
% idx_L1   = 1  
% idx_L2   = 2
% idx_JC  = 16   % From 1 to 50
idx_JC_vec = [16,26,36,46]; % I WANT TO SCROLL THIS ARRAY TO GET THE FIGURE WITH 4 PLOTS
t=tiledlayout(2,2,"Padding","compact","TileSpacing","compact");
for k=1:numel(idx_JC_vec)
    nexttile
    idx_JC = idx_JC_vec(k);
% Colos setting
colors_HIM =  [1 0.3 0.3;0.3 0.8 0.9];
colors_PLO = [my_red;my_blue];
%fig = figure;
hold on;axis equal; grid on; box on;
UHIM_plots = zeros(1,2); % preallocation
text_pos =[-0.0012,-0.0025;
           -0.00075,-0.0025];
% Plot trajectories of unstable manifold
for idx_L=1:2
    lgd_label         = ['$JC =$',num2str(UHIM_DB(idx_L).data(idx_JC).JC,'%9.6f')];
    UHIM_plots(idx_L) = plot([UHIM_DB(idx_L).data(idx_JC).PLO_to_CI.x],...
       [UHIM_DB(idx_L).data(idx_JC).PLO_to_CI.y],'Color',colors_HIM(idx_L,:),'LineWidth',0.3,'DisplayName',lgd_label); 
    % Plot PLOs
    plot([UHIM_DB(idx_L).data(idx_JC).PLO.x],[UHIM_DB(idx_L).data(idx_JC).PLO.y],'Color',colors_PLO(idx_L,:),'LineWidth',0.8);
    % Plot L-points
    plot(UHIM_DB(idx_L).L_point_pos.x,UHIM_DB(idx_L).L_point_pos.y,'.',...
        'color',[0,0,0],'MarkerFaceColor',my_green,'MarkerSize',10);
    text(UHIM_DB(idx_L).L_point_pos.x+text_pos(idx_L,1),UHIM_DB(idx_L).L_point_pos.y+text_pos(idx_L,2),['$L_{',num2str(idx_L),'}$'],'Interpreter',"latex");
end
% Selection of CI radius based on Jcbi cst value (Ly orbit size)
if (idx_JC >=1 && idx_JC <=5)
    factor_k = 2.0
elseif (idx_JC >=6 && idx_JC <=15)
    factor_k = 2.5
elseif (idx_JC >=16 && idx_JC <=25)
    factor_k = 3.0    
elseif (idx_JC >=26 && idx_JC <=40)
    factor_k = 3.5
elseif (idx_JC >=41 && idx_JC <=50)
    factor_k = 4.0       
end
rCI_EM_km = factor_k .* 9.29e+05;
rCI_EM    = rCI_EM_km / 1.496e+08;
mu = 3.04042342644015e-06;
% Circles data
xC = (mu-1);
yC = 0; 
angle = 0:0.1:360;
circX = xC + rCI_EM*cosd(angle); circY = yC + rCI_EM*sind(angle);
% legend labels 
k_value    = ['$k =\ $',num2str(factor_k)];
r_CI_value = ['$r_{CI} =\ $',num2str(rCI_EM_km,'%3.2e'),'$\ km$'];
% Plot CI
CI_plot=plot(circX, circY,'Color',[0 1 0],'LineWidth',0.7,'DisplayName',r_CI_value);
% Plot Earth + Moon system 
plot(mu -1,0,'.',...
    'color',my_blue,'MarkerFaceColor',my_blue,'MarkerSize',20);
text(mu-1.0,0-0.0025,'$E/M$','Interpreter',"latex",'Color',my_blue);
%Legend 
lgd = legend([UHIM_plots,CI_plot],'Orientation',"vertical",'Location',"northeast");
lgd.Interpreter = 'latex'; 
lgd.FontSize    = 9;
% dim = [.24 .835 .150 .06];
% 
% str = ['$JC\ index = $ ',num2str(idx_JC),newline,...
%        '$No.\ traj.\ L_1 = $',num2str(numel([UHIM_DB(idx_L).data(idx_JC).PLO_to_CI.x])/200),newline,...
%        '$No.\ traj.\ L_2 = $',num2str(numel([UHIM_DB(idx_L).data(idx_JC).PLO_to_CI.x])/200)];
% annotation('textbox',dim,'String',str,'Interpreter',"latex",'FitBoxToText','on',...
%            'BackgroundColor',[1 1 1],'FontSize',8);
% Axes lables
xlabel(t,'$x$ (au)','interpreter','latex','fontsize',12); ylabel(t,'$y$ (au)','interpreter','latex','FontSize',12);
% Option to center better the curves inside the plot window
x_lim = xlim; y_lim = ylim;
xlim([x_lim(1)-0.0*norm(x_lim) x_lim(2)+0.0*norm(x_lim)]);
ylim([y_lim(1)-0.1*norm(y_lim) y_lim(2)+0.4*norm(y_lim)]);
title(k_value,'Interpreter','latex');
end
%exportgraphics(fig,['fig_UHIM_traj_CI_JC_id_',num2str(idx_JC),'.pdf'],'ContentType','vector')
%%save as pdf
I want to get a figure with 4 plots like the one above according this layout (taken from tiledlayout documentation page):

EDIT(08/10/2022, 21:46): How can I get all equal tiles and with largest size inside my figure?
0 Comments
Accepted Answer
  Star Strider
      
      
 on 8 Oct 2022
        
      Edited: Star Strider
      
      
 on 8 Oct 2022
  
      tiledlayout(2,2)
for k = 1:numel(idx_JC_vec)
    nexttile
    idx_JC = idx_JC_vec(k)
    . . . CODE . . .
end
I believe this is close to what you want to do.  
There is an indexing error in the original code that I cannot locate, so I leave that to you.  When that problem is solved, the rest should work and create the desired result.  (That problem existed before I added the loop, so unless there is another problem, the loop is likely not the source of it.)  
I usually use ‘k’ (or some version of it, such as ‘k1’, ‘k2’, etc.) as the loop index.  I did not see any other instances of it, however if it causes problems, change it since it only appears in my loop code in the first three lines.    
EDIT — (8 Oct 2022 at 17:46)
EDIT — (8 Oct 2022 at 18:16)
I thought both ‘UHIM_DB.mat’ files were the same.  They aren’t.  The second one has the missing (or corrected) variables.  
% load UHIM_DB   % I reduce the original database to only 4 values of Jacobi constant
% load Customized_colors
load(websave('UHIM_DB','https://www.mathworks.com/matlabcentral/answers/uploaded_files/1149585/UHIM_DB.mat'))
load(websave('Customized_colors','https://www.mathworks.com/matlabcentral/answers/uploaded_files/1149570/Customized_colors.mat'))
% load UHIM_DB   % I reduce the original database to only 4 values of Jacobi constant
% load Customized_colors
%Trajectories family selection
% idx_L1   = 1  
% idx_L2   = 2
% idx_JC  = 16   % From 1 to 50
idx_JC_vec = [16,26,36,46]; % I WANT TO SCROLL THIS ARRAY TO GET THE FIGURE WITH 4 PLOTS
t=tiledlayout(2,2,"Padding","compact","TileSpacing","compact");
for k=1:numel(idx_JC_vec)
    nexttile
    idx_JC = idx_JC_vec(k);
% Colos setting
colors_HIM =  [1 0.3 0.3;0.3 0.8 0.9];
colors_PLO = [my_red;my_blue];
%fig = figure;
hold on;axis equal; grid on; box on;
UHIM_plots = zeros(1,2); % preallocation
text_pos =[-0.0012,-0.0025;
           -0.00075,-0.0025];
% Plot trajectories of unstable manifold
for idx_L=1:2
    lgd_label         = ['$JC =$',num2str(UHIM_DB(idx_L).data(idx_JC).JC,'%9.6f')];
    UHIM_plots(idx_L) = plot([UHIM_DB(idx_L).data(idx_JC).PLO_to_CI.x],...
       [UHIM_DB(idx_L).data(idx_JC).PLO_to_CI.y],'Color',colors_HIM(idx_L,:),'LineWidth',0.3,'DisplayName',lgd_label); 
    % Plot PLOs
    plot([UHIM_DB(idx_L).data(idx_JC).PLO.x],[UHIM_DB(idx_L).data(idx_JC).PLO.y],'Color',colors_PLO(idx_L,:),'LineWidth',0.8);
    % Plot L-points
    plot(UHIM_DB(idx_L).L_point_pos.x,UHIM_DB(idx_L).L_point_pos.y,'.',...
        'color',[0,0,0],'MarkerFaceColor',my_green,'MarkerSize',10);
    text(UHIM_DB(idx_L).L_point_pos.x+text_pos(idx_L,1),UHIM_DB(idx_L).L_point_pos.y+text_pos(idx_L,2),['$L_{',num2str(idx_L),'}$'],'Interpreter',"latex");
end
% Selection of CI radius based on Jcbi cst value (Ly orbit size)
if (idx_JC >=1 && idx_JC <=5)
    factor_k = 2.0
elseif (idx_JC >=6 && idx_JC <=15)
    factor_k = 2.5
elseif (idx_JC >=16 && idx_JC <=25)
    factor_k = 3.0    
elseif (idx_JC >=26 && idx_JC <=40)
    factor_k = 3.5
elseif (idx_JC >=41 && idx_JC <=50)
    factor_k = 4.0       
end
rCI_EM_km = factor_k .* 9.29e+05;
rCI_EM    = rCI_EM_km / 1.496e+08;
mu = 3.04042342644015e-06;
% Circles data
xC = (mu-1);
yC = 0; 
angle = 0:0.1:360;
circX = xC + rCI_EM*cosd(angle); circY = yC + rCI_EM*sind(angle);
% legend labels 
k_value    = ['$k =\ $',num2str(factor_k)];
r_CI_value = ['$r_{CI} =\ $',num2str(rCI_EM_km,'%3.2e'),'$\ km$'];
% Plot CI
CI_plot=plot(circX, circY,'Color',[0 1 0],'LineWidth',0.7,'DisplayName',r_CI_value);
% Plot Earth + Moon system 
plot(mu -1,0,'.',...
    'color',my_blue,'MarkerFaceColor',my_blue,'MarkerSize',20);
text(mu-1.0,0-0.0025,'$E/M$','Interpreter',"latex",'Color',my_blue);
%Legend 
lgd = legend([UHIM_plots,CI_plot],'Orientation',"vertical",'Location',"northeast");
lgd.Interpreter = 'latex'; 
lgd.FontSize    = 9;
% dim = [.24 .835 .150 .06];
% 
% str = ['$JC\ index = $ ',num2str(idx_JC),newline,...
%        '$No.\ traj.\ L_1 = $',num2str(numel([UHIM_DB(idx_L).data(idx_JC).PLO_to_CI.x])/200),newline,...
%        '$No.\ traj.\ L_2 = $',num2str(numel([UHIM_DB(idx_L).data(idx_JC).PLO_to_CI.x])/200)];
% annotation('textbox',dim,'String',str,'Interpreter',"latex",'FitBoxToText','on',...
%            'BackgroundColor',[1 1 1],'FontSize',8);
% Axes lables
xlabel(t,'$x$ (au)','interpreter','latex','fontsize',12); ylabel(t,'$y$ (au)','interpreter','latex','FontSize',12);
% Option to center better the curves inside the plot window
x_lim = xlim; y_lim = ylim;
xlim([x_lim(1)-0.0*norm(x_lim) x_lim(2)+0.0*norm(x_lim)]);
ylim([y_lim(1)-0.1*norm(y_lim) y_lim(2)+0.4*norm(y_lim)]);
title(k_value,'Interpreter','latex');
end
%exportgraphics(fig,['fig_UHIM_traj_CI_JC_id_',num2str(idx_JC),'.pdf'],'ContentType','vector')
%%save as pdf
%exportgraphics(fig,['fig_UHIM_traj_CI_JC_id_',num2str(idx_JC),'.pdf'],'ContentType','vector')
%%save as pdf
%exportgraphics(fig,['fig_UHIM_traj_CI_JC_id_',num2str(idx_JC),'.pdf'],'ContentType','vector')
%%save as pdf
.
9 Comments
  Star Strider
      
      
 on 9 Oct 2022
				Thank you!  
I did not entirely understand the latest problem, however I am happy that my approach using Position was part of the solution.  
More Answers (1)
  Image Analyst
      
      
 on 8 Oct 2022
        5 Comments
  Image Analyst
      
      
 on 8 Oct 2022
				You have problems with indexing when I run it:
idx_JC =
    16
Index exceeds the number of array elements. Index must not exceed 4.
Error in test7 (line 31)
    lgd_label         = ['$JC =$',num2str(UHIM_DB(idx_L).data(idx_JC).JC,'%9.6f')]; 
Can you fix that first?
See Also
Categories
				Find more on Axes Appearance in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!




