How can I zoom in/out in a plot with two x axes?
8 ビュー (過去 30 日間)
古いコメントを表示
I am plotting a figure with two x axis, in which the top x axis is a parameter equivalent to bottom x axis based on a relation. I appreciate if someone could help me to correct my code to be able to do zoom in/out on figure and all axes at the same time?
t = 0:0.05:10;
S = cos(t);
figure; plot(t, abs(S), 'r');
box off
xlabel('Time (ns)')
ylabel('Amplitude')
Tm = (t+10)./(0.0032*2*pi); %top x axis
%--------------------------------------------------------------------------
hAx = gca;
hAx = axes('Position',hAx.Position,'XAxisLocation','top','YAxisLocation','right','color','none');
%--------------------------------------------------------------------------
hAx.XLim = [Tm(1) Tm(end)];
hAx.XTick = linspace(Tm(1),Tm(end),11);
hAx.XColor = 'black';
hAx.XLabel.String = 'Equivalent Param.';
hAx.XLabel.FontSize = 10;
%--------------------------------------------------------------------------
hAx.YColor = 'black';
hAx.YTickLabel = ' ';
0 件のコメント
採用された回答
Voss
2022 年 4 月 15 日
If the XLimits of each axes were supposed to always be the same as each other as you zoom, then I would say you could use linkaxes, but here the situation is that the XLimits of one axes are related to the XLimits of the other axes by the equation Tm = (t+10)./(0.0032*2*pi);
In this case, I would write a function that does the updating of one axes' XLimits based on the value of the other axes' XLimits. Then set that function to execute when zooming happens, by setting the ActionPostCallback property of the zoom object in the figure. (The function would have to have access to both axes.) Something like this:
t = 0:0.05:10;
S = cos(t);
figure; plot(t, abs(S), 'r');
box off
xlabel('Time (ns)')
ylabel('Amplitude')
Tm = (t+10)./(0.0032*2*pi); %top x axis
%--------------------------------------------------------------------------
hAx_bottom = gca;
hAx = axes('Position',hAx_bottom.Position,'XAxisLocation','top','YAxisLocation','right','color','none');
%--------------------------------------------------------------------------
hAx.XLim = [Tm(1) Tm(end)];
% hAx.XTick = linspace(Tm(1),Tm(end),11);
hAx.XColor = 'black';
hAx.XLabel.String = 'Equivalent Param.';
hAx.XLabel.FontSize = 10;
%--------------------------------------------------------------------------
hAx.YColor = 'black';
hAx.YTickLabel = ' ';
% store the axes' handles in a struct associated with
% the figure so the cb_zoom function can access them:
guidata(gcf(),struct('hAx',hAx,'hAx_bottom',hAx_bottom));
% associate cb_zoom with the zoom object:
set(zoom(),'ActionPostCallback',@cb_zoom);
% this function is executed when zooming occurs
function cb_zoom(f,evt)
% Tm = (t+10)./(0.0032*2*pi);
% t <-> hAx_bottom
% Tm <-> hAx (top axes)
S = guidata(f);
if evt.Axes == S.hAx % top axes is being zoomed on
% update the bottom axes XLimits
set(S.hAx_bottom,'XLim',get(S.hAx,'XLim')*0.0032*2*pi-10); % Tm -> t
else % bottom axes is being zoomed on
% update the top axes XLimits
set(S.hAx,'XLim',(get(S.hAx_bottom,'XLim')+10)./(0.0032*2*pi)); % t -> Tm
end
end
その他の回答 (1 件)
Bruno Luong
2022 年 4 月 15 日
Probably using linkaxes
hAx1 = gca;
hAx = axes('Position',hAx1.Position,'XAxisLocation','top','YAxisLocation','right','color','none');
...
linkaxes([hAx1 hAx], 'x')
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Visual Exploration についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!