How to create figure containing 4 plots with tiledlayout for different values of a parameter?

5 次查看(过去 30 天)
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
factor_k = 3
factor_k = 3.5000
factor_k = 3.5000
factor_k = 4
%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?

采纳的回答

Star Strider
Star Strider 2022-10-8
编辑:Star Strider 2022-10-8
The essence of creating the tiledlayout here is:
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
factor_k = 3
factor_k = 3.5000
factor_k = 3.5000
factor_k = 4
%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 个评论
Giuseppe
Giuseppe 2022-10-9
Hi @Star Strider, eventually I managed to solve with a trial and error method, by adding these lines at the end of the code:
% I converted all lenghts (inside the code) in phisical units (km) by using the conversion
% factor au2km
au2km = 1.495978707e+08
offset= 0.030e8;
xLim_tiled_1 = (mu-1)*au2km - (4* 9.29e+05);
xLim_tiled_2 = (mu-1)*au2km + (4* 9.29e+05);
xlim([xLim_tiled_1-offset xLim_tiled_2+offset]);
ylim([-3.85e+6 4.9e+6]);
set(gcf,'position',[278.6, 0.2, 950, 700]);
Star Strider
Star Strider 2022-10-9
Thank you!
I did not entirely understand the latest problem, however I am happy that my approach using Position was part of the solution.

请先登录,再进行评论。

更多回答(1 个)

Image Analyst
Image Analyst 2022-10-8
I'm not seeing where you called nexttile. You need to do that.
  5 个评论
Image Analyst
Image Analyst 2022-10-8
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?

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Geographic Plots 的更多信息

产品


版本

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by