Вы почти у цели, но есть некоторые структурные проблемы, когда вы изменили код только из одного набора осей.
Главное, что нужно сделать, это изменить функцию обратного вызова со строки на фактическую локальнуюфункция.Это делает обработку обратного вызова намного проще!
Я адаптировал ваш код для работы с двумя (или более) осями.Обратите внимание, нам нужно настроить полосу прокрутки только один раз!Вы настраивали его для каждой оси (полосы прокрутки располагались друг над другом), и оба скроллера работали только на gca
.Одного названия осей недостаточно для изменения gca
, вы должны использовать эти переменные!Я назначил оси массиву для удобства манипулирования.
Подробности см. В комментариях:
x=0:1e-2:2*pi;
y=sin(x);
% dx is the width of the axis 'window'
dx=2;
% Initialise the figure once, and we only need to set the properties once
fig = figure(1); clf;
set( fig, 'doublebuffer', 'on');
% Create a placeholder for axes objects
ax = gobjects( 2, 1 );
% Create plots, storing them in the axes object
ax(1) = subplot(2,1,1);
plot(x, y);
ax(2) = subplot(2,1,2);
plot(x, y);
% Set up the scroller for the array of axes objects in 'ax'
scrollplot( dx, x, ax)
function scrollplot( dx, x, ax )
% Set appropriate axis limits
for ii = 1:numel(ax)
set( ax(ii), 'xlim', [0 dx] );
end
% Create Uicontrol slider
% The callback is another local function, this gives us more
% flexibility than a character array.
uicontrol('style','slider',...
'units', 'normalized', 'position', [0.1 0.01 0.8 0.05],...
'callback', @(slider, ~) scrollcallback( ax, dx, slider ), ...
'min', 0, 'max', max(x)-dx );
end
function scrollcallback( ax, dx, slider, varargin )
% Scroller callback loops through the axes objects and updates the xlim
val = slider.Value;
for ii = 1:numel(ax)
set( ax(ii), 'xlim', val + [0, dx] );
end
end