2013-04-12 3 views
2

У меня есть матрица, которая будет построена по одной колонке за раз. Можно ли добавить слайдер к фигуре MATLAB (без тяжелого программирования GUI), чтобы при перемещении ползунка на текущей оси отображались разные столбцы?MATLAB простой слайдер на рисунке

+1

К сожалению, нет, это не будет однолинейным тривиальным. Вам нужно добавить слайдер и написать обратный вызов. Вы имеете в виду Mathematica? – Oleg

+0

Да, может быть, что-то в этом роде. Я сделал это, создав интерфейс с помощью GLIDE. Но кажется, что есть команды (uicontrol) для размещения элементов управления на фигуре. Мне интересно, что такое минимальная часть кода, которая легко интегрируется с уже существующим скриптом Matlab. Я не против писать обратный вызов, но я не хочу переносить все данные вокруг этих объектов, которые передают от обратного вызова к обратному вызову. Возможно ли, чтобы обратный вызов считывал данные из рабочей области? – passerby51

+0

Вы можете отобразить все полосы сразу и установить их невидимыми (кроме первого), тогда ползунок просто установит видимый объект интереса. – Oleg

ответ

3

Вот код для слайдера построить соответствующий столбец:

m = ones(5,1)*(1:5); 
slmin = 1; 
slmax = size(m,2); 
plot(m(:,1)) 
hsl = uicontrol('Style','slider','Min',slmin,'Max',slmax,... 
       'SliderStep',[1 1]./(slmax-slmin),'Value',1,... 
       'Position',[20 20 200 20]); 
set(hsl,'Callback',@(hObject,eventdata) plot(m(:,round(get(hObject,'Value'))))) 

EDIT:

Для повышения производительности вы можете просто обновить YData значения:

set(hsl,'Callback',@(hObject,eventdata) ... 
    set(hline,'YData',m(:,round(get(hObject,'Value'))))) 

Чтобы установить ограничение на оси y, просто установите их вручную с ylim([0 6]) после первого plot звонок.

+0

Этот пример немного вводит в заблуждение. Он пересматривает каждый раз, что не является оптимальным со многих точек зрения, но одно мгновение - это изменение «xlims». Похоже, слайдер изменяет yaxis, а не линию. – Oleg

+1

Вы правы. Производительность мудрее быстрее сбросить 'YData' для объекта линии. Хотя возможно, что новые данные могут быть вне пределов текущего времени. – yuk

+1

Вот почему я рекомендовал бы строить все, настраивать ось, скрывать некоторые данные и связывать ползунок, чтобы скрыть/показать соответствующие «столбцы». – Oleg

4

Код для создания слайдера разумно минимален:

uicontrol('Style', 'slider', 'Callback', @sliderCallback); 

function sliderCallback(hObject, evt) 
    fprintf('Slider value is: %d\n', get(hObject, 'Value')); 
end 

Вы хотите посмотреть на такие свойства, как Position, чтобы установить позицию на рисунке, и Max и Min установить возможный диапазон значения. Также обратите внимание, что если вы сделаете это внутри функции, ваш sliderCallback может быть вложенной функцией, которая, вероятно, упростит перерисовку вашего дисплея. Если вы запустите это в скрипте, sliderCallback должен быть в отдельном файле.

+0

Спасибо. Я закончил использование вложенной функции (внутри функции) для обратного вызова, так как тогда я могу напрямую использовать переменные в рабочем пространстве функции. – passerby51