Borrar filtros
Borrar filtros

How can I zoom in/out in a plot with two x axes?

12 visualizaciones (últimos 30 días)
Amy Lg
Amy Lg el 14 de Abr. de 2022
Comentada: Amy Lg el 26 de Mayo de 2022
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 = ' ';

Respuesta aceptada

Voss
Voss el 15 de Abr. de 2022
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

Más respuestas (1)

Bruno Luong
Bruno Luong el 15 de Abr. de 2022
Probably using linkaxes
hAx1 = gca;
hAx = axes('Position',hAx1.Position,'XAxisLocation','top','YAxisLocation','right','color','none');
...
linkaxes([hAx1 hAx], 'x')

Categorías

Más información sobre Visual Exploration en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by