How do I make both yyaxis axes zoom together?
42 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
MathWorks Support Team
le 15 Fév 2017
Réponse apportée : Julian Hapke
le 11 Août 2023
When I plot two figures using "yyaxis" and use the interactive zoom, only the right (active) axis zooms. The other one does not get updated. How can I fix this?
Réponse acceptée
MathWorks Support Team
le 1 Juin 2023
Modifié(e) : MathWorks Support Team
le 5 Juin 2023
This behavior is in accordance with the "yyaxis" function documentation (See under "Axes Properties" in the "More About" section of the link below)
However, you can achieve the desired behavior by following these steps:
1. Plot your data using "yyaxis" as normal
2. Create a callback function that, before the zoom happens, saves the old axis limits.
3. Create a callback function that, after the zoom happens, edits the axis values for the (previously unaffected) left axis.
In the attached files, file "saveAxisStatus.m" defines the pre-zoom callback behavior, and "zoomSecondAxis.m" defines the post-zoom callback behavior. The file "Example.m" demonstrates how to use these two functions.
0 commentaires
Plus de réponses (2)
Andres
le 6 Déc 2021
Modifié(e) : MathWorks Support Team
le 10 Juin 2022
I have uploaded a solution (yyzoom) to the File Exchange,
that stores the base values for the axes limits relation inside the callback function of a listener to the YLim property of the yyaxis chart axes. I've had the opportunity to test it with R2021a/b up to now.
0 commentaires
Julian Hapke
le 11 Août 2023
Here's a function that does not rely on an activated zoom tool and also works for panning
function yysync(ax)
%YYSYNC links left and right yyaxis, so they pan and zoom synchronously
%
% unfortunately the PostSet event is also triggered when ylim() is called
% so if you want to set axis limits independently, you have to to so before
% calling yysync
%
% Syntax:
% yysync(ax)
%
% Inputs:
% ax:
% the axes whose yyaxis shall be linked
% graphics handle
% required
%
% Outputs:
% -
%
% Examples:
% -
%
% See also: yyaxis, ylim
%
rulers = ax.YAxis;
if numel(rulers) == 1
% no second y axis
return
end
factor = diff(rulers(2).Limits) / diff(rulers(1).Limits);
offset = rulers(2).Limits(1) - factor * rulers(1).Limits(1);
function setOtherLimits(~, event)
obj = event.AffectedObject;
if obj.YAxisLocation == "right"
obj.YAxis(1).Limits = (obj.YLim - offset) / factor;
else
obj.YAxis(2).Limits = factor .* obj.YLim + offset;
end
end
addlistener(ax, 'YLim', 'PostSet', @setOtherLimits);
end
0 commentaires
Voir également
Catégories
En savoir plus sur Two y-axis dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!