Использование одного ползунка для обновления нескольких графиков в Matlab - PullRequest
0 голосов
/ 19 декабря 2018

Я пишу сценарий, который создаст 2 супплота и будет иметь либо один ползунок, который прокручивает ось x обоих графиков, либо 2 ползунка, которые по отдельности управляют каждой из осей x графиков.

Я использовал адаптированную версию Стивена Лорда Демонстрация прокрутки FileExchange для моего слайдера.

Прямо сейчас он будет обновлять только самый последний график (поскольку в настоящее время он использует gca в своей функции обратного вызова).Я попытался просто заменить gca на нужные мне оси (переменные first_plot или second_plot), но это, похоже, не работает.

Тогда мой вопрос: как мне адаптировать эту функцию для управления обоими графиками или каждым графиком в отдельности?Вот пример сценария, который я пишу:

x=0:1e-2:2*pi;
y=sin(x);
dx=2;
first_plot = subplot(2,1,1);
plot(x, y);
scrollplot(dx, x)
%Plot the respiration and probe data with scrolling bar

second_plot = subplot(2,1,2);
plot(x, y); 
scrollplot(dx,x)

% dx is the width of the axis 'window'
function scrollplot(dx, x)
a=gca;
% Set appropriate axis limits and settings
set(gcf,'doublebuffer','on');

set(a,'xlim',[0 dx]);

% Generate constants for use in uicontrol initialization
pos=get(a,'position');
Newpos=[pos(1) pos(2)-0.1 pos(3) 0.05];
% This will create a slider which is just underneath the axis
% but still leaves room for the axis labels above the slider
xmax=max(x);
%S= set(gca,'xlim',(get(gcbo,'value')+[0 dx]));   
S=['set(gca,''xlim'',get(gcbo,''value'')+[0 ' num2str(dx) '])'];
% Setting up callback string to modify XLim of axis (gca)
% based on the position of the slider (gcbo)

% Creating Uicontrol
h=uicontrol('style','slider',...
    'units','normalized','position',Newpos,...
    'callback',S,'min',0,'max',xmax-dx);
end

Спасибо!

1 Ответ

0 голосов
/ 19 декабря 2018

Вы почти у цели, но есть некоторые структурные проблемы, когда вы изменили код только из одного набора осей.

Главное, что нужно сделать, это изменить функцию обратного вызова со строки на фактическую локальнуюфункция.Это делает обработку обратного вызова намного проще!

Я адаптировал ваш код для работы с двумя (или более) осями.Обратите внимание, нам нужно настроить полосу прокрутки только один раз!Вы настраивали его для каждой оси (полосы прокрутки располагались друг над другом), и оба скроллера работали только на 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
...