Subplot existing plots with left, right, bottom, and top axes.

조회 수: 5 (최근 30일)
Mohammed Ali
Mohammed Ali 2021년 3월 19일
답변: Jatin 2024년 9월 10일
Hello
I have to plot with different units like the left axis has km unit and the right axis has mile unit. When I plot the right and top axes not shown in the subplot. Please see the code.
figure('Renderer', 'painters', 'Position', [10 10 700 500])
h1=figure (1)
x=0:1:10;
y=x.^2;
ax1 = gca;
plot(x,y)
grid on
set(gca,'GridLineStyle',':')
xt = get(ax1,'XTick')
yt = get(ax1,'YTick')
ax2 = copyobj(ax1,h1);
set(ax2,'XAxisLocation','top')
set(ax2,'YAxisLocation','right')
x = xt*3.28084;
y = yt*10.7639;
set(ax2,'XTickLabel',x)
set(ax2,'YTickLabel',y)
figure('Renderer', 'painters', 'Position', [10 10 700 500])
h2=figure (2)
x=0:1:10;
y=x.^0.5;
ax1 = gca;
plot(x,y)
grid on
set(gca,'GridLineStyle',':')
xt = get(ax1,'XTick')
yt = get(ax1,'YTick')
ax2 = copyobj(ax1,h2);
set(ax2,'XAxisLocation','top')
set(ax2,'YAxisLocation','right')
x = xt*3.28084;
y = yt*10.7639;
set(ax2,'XTickLabel',x)
set(ax2,'YTickLabel',y)
figlist=get(groot,'Children');
newfig=figure;
tcl=tiledlayout(newfig,'flow')
for i = 1:numel(figlist)
figure(figlist(i));
ax=gca;
ax.Parent=tcl;
ax.Layout.Tile=i;
end

답변 (1개)

Jatin
Jatin 2024년 9월 10일
You can utilize a tiled layout using "nexttile", where each tile contains an independent plot. Additionally, by using "linkaxes", you can link "ax1" and "ax2" to synchronize the pan and zoom actions between the axes. Please check if the following code resolves your issue:
% Create a new figure with tiled layout
newfig = figure('Renderer', 'painters', 'Position', [10 10 700 500]);
tcl = tiledlayout(newfig, 2, 1); % Two rows, one column
% First subplot
nexttile;
x = 0:1:10;
y = x.^2;
plot(x, y);
grid on;
set(gca, 'GridLineStyle', ':');
xlabel('Distance (km)');
ylabel('Value (km^2)');
% Create secondary axes for miles
ax1 = gca;
ax2 = axes('Position', ax1.Position, 'XAxisLocation', 'top', 'YAxisLocation', 'right', 'Color', 'none', 'XColor', 'r', 'YColor', 'r');
linkaxes([ax1, ax2], 'xy'); % Link axes for synchronized zoom and pan
% Set secondary axes ticks and labels
x_miles = x * 0.621371; % Convert km to miles
y_miles = y * 0.386102; % Convert km^2 to mile^2
xticks(ax2, x);
yticks(ax2, y);
xticklabels(ax2, num2str(x_miles', '%.2f'));
yticklabels(ax2, num2str(y_miles', '%.2f'));
xlabel(ax2, 'Distance (miles)');
ylabel(ax2, 'Value (mile^2)');
% Second subplot
nexttile;
x = 0:1:10;
y = x.^0.5;
plot(x, y);
grid on;
set(gca, 'GridLineStyle', ':');
xlabel('Distance (km)');
ylabel('Value (sqrt(km))');
% Create secondary axes for miles
ax1 = gca;
ax2 = axes('Position', ax1.Position, 'XAxisLocation', 'top', 'YAxisLocation', 'right', 'Color', 'none', 'XColor', 'r', 'YColor', 'r');
linkaxes([ax1, ax2], 'xy'); % Link axes for synchronized zoom and pan
% Set secondary axes ticks and labels
x_miles = x * 0.621371; % Convert km to miles
y_miles = y * sqrt(0.621371); % Convert sqrt(km) to sqrt(miles)
xticks(ax2, x);
yticks(ax2, y);
xticklabels(ax2, num2str(x_miles', '%.2f'));
yticklabels(ax2, num2str(y_miles', '%.2f'));
xlabel(ax2, 'Distance (miles)');
ylabel(ax2, 'Value (sqrt(miles))');
Refer to the below documentation on "nexttile" for more details:

카테고리

Help CenterFile Exchange에서 Subplots에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by