슬라이더를 움직여 플롯을 조작하는 방법: GUI 만들기

MATLAB에서의 GUI 작성에 관한 작은 재료입니다.

사용 환경: MATLAB R2017a
사용한 도구 상자: n/a

도전



시간 변화가 있는 2차원 플롯에서 시간 변화를 보고 싶은, 3차원 데이터의 슬라이스 플롯을 그릴 때에 슬라이스 위치를 이동시켜 묘화하고 싶다. 그럴 때 편리한 슬라이더로 조작을 MATLAB에서 구현하고 싶습니다.

MATLAB의 Q&A 사이트 MATLAB Answers 에도 투고가 있습니다만, 슬라이더 바를 조작해 묘화를 만지는 방법은 의외로 안쪽이 깊다. 슬라이더를 조작하는 경우, uicontrol 로 지정하는 Callback 함수는 슬라이더를 마우스로 이동시켜 끝났을 때 밖에 실행되지 않기 때문에, 슬라이더를 마우스 이동시키면서 플롯을 변화시키고 싶은 경우에는 사용할 수 없다. .

마우스가 클릭된 상태의 경우에 처리를 실시할 수 있는 WindowButtonMotionFcn 로 실현도 가능하면 있으면 별로 아름답지 않다. .
참고 : 슬라이더를 움직여 마우스를 누른 상태에서 그래프 위치를 조정하는 등의 처리를 넣는 것이 가능합니까?

addlistener



여기에서는 addlistener 를 사용해 보겠습니다. 자세한 것은 이벤트 및 리스너 개요 에 설명되어 있으므로 생략 합니다만, 요점은 슬라이더 바가 변화했다고 하는 이벤트를 검지해, 플롯을 변화시키는 처리를 순차적으로 실행합니다. 이 기능을 사용하여 슬라이더 바의 조작을 동적으로 플롯에 반영시켜 보겠습니다.
데이터는 스칼라 볼륨 데이터 시각화 기술 에서 사용되고 있는 「사람의 머리의 27 개의 이미지 슬라이스인 일련의 MRI 데이터 세트」를 사용하고 있습니다. MATLAB에 들어 있는 데이터이므로, 이대로 copipe로 실행할 수 있을 것.


% データ読み込み
load mri
D = squeeze(D);

% Plot
figure(1)
[~,handle_surf] = contour(D(:,:,1));
title('スカラー ボリューム データの可視化');

% スライダーバー作成
handle_slider = uicontrol('Style','slider','Position',[10 50 20 340],'Min',1,'Max',27,'Value',1);

% イベントリスナーの作成
addlistener(handle_slider,'Value','PostSet',@(event,obj) update(event,obj,D,handle_surf,handle_slider));

% 描画のアップデート処理用関数

function update(event,obj,D,handle_surf,handle_slider)
index = round(handle_slider.Value);
handle_surf.ZData = double(D(:,:,index));
end

좋은 웹페이지 즐겨찾기