2011-02-09 3 views
15

Matlab에서 사용자가 플롯 창을 확대 할 때 축 세트에 플롯 된 데이터를 업데이트하고 싶습니다. 예를 들어, 분석적으로 정의 된 특정 함수를 플롯하려고한다고 가정합니다. 사용자가 임의의 해상도로 함수를 검사 할 수 있도록 추적을 확대 할 때 플롯 창을 추가 데이터로 업데이트하고 싶습니다.플롯이 확대/축소/재 렌더링 될 때 Matlab은 콜백을 실행합니까?

보기가 변경되면 Matlab에서 데이터를 업데이트하기위한 후크를 제공합니까? (또는 간단히 다시 그릴 때입니까?)

답변

9

예. ZOOM 모드 객체는 다음 콜백이 있습니다

ButtonDownFilter 
ActionPreCallback 
ActionPostCallback 

후자의 두 가지 중 하나를 직전 또는 직후에 줌 기능을 실행됩니다. ActionPostCallback에 업데이트 기능을 설정할 수 있습니다. 여기서 새 축 한계 (축 핸들이 두 번째 입력 인수로 콜백에 전달됨)에 따라 플롯을 업데이트합니다.

+0

고마워요, 이것이 제가 찾고 있던 것입니다! 일반 다시 그리기 콜백이 있습니까? – nibot

+0

@nibot : ['refresh']처럼 (http://www.mathworks.com/help/techdoc/ref/refresh.html)? 또는'drawnow'가 큐를 플러시합니다. – Jonas

+1

MatLab이 그림을 다시 그릴 때마다 내가 지정한 함수를 호출 할 수있는 방법이 있습니까? – nibot

16

이 질문을 해결하기 위해 아직 일반 "다시 그리기"콜백을 찾지는 못했지만 모든 상황에서 (거의 모든)이 목표를 달성 할 수있는 4 가지 콜백 그룹 *을 함께 구성했습니다.
set(zoom(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

2를 셋업 pan callback function : 주어진 축 ax = gca(),

1. 설정 zoom callback function 감독 by @Jonas 같은 개체에 대한
set(pan(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

3. 설정을 figure resize callback function :
set(getParentFigure(ax),'ResizeFcn',@(x,y) myCallbackFcn(ax));

4. 편집 : 더 이상 R2014b에서 작동하지 않지만 그림에 컬러 바를 추가하는 경우 (그림 크기 또는 축 줌/팬을 변경하지 않고 축 위치를 변경하는 경우)에만 필요합니다. 나는 대체품을 찾지 않았다. 마지막으로 축 위치 속성 자체에 undocumented property listener을 설정하십시오. 여기에는 중요한 트릭이 하나 있습니다 : 우리는 handle.listener 객체의 핸들을 잡고 있어야합니다 (또는 범위를 벗어나면) 콜백을 제거합니다. Axes 객체 자체의 속성 인 UserData은 많은 경우에 숨길 수있는 좋은 장소입니다. 나는 기본 콜백 이벤트 인수를 폐기하고 대신 익명 함수 내에서 문제의 축을 캡처 선택한 모든 경우에

hax = handle(ax); 
hprop = findprop(hax,'Position'); 
h = handle.listener(hax,hprop,'PropertyPostSet',@(x,y) myCallbackFcn(ax)); 
set(ax,'UserData',h); 

. 나는 이것들이 서로 다른 콜백 시나리오를 통해 전파되는 다양한 형태의 논쟁에 대처하기보다 훨씬 더 유용하다는 것을 알았다.

* 너무 많은 콜백 소스가 돌아 다니면서 무한 루프로 끝나지 않도록하기 위해 myCallbackFcn의 시작 부분에 recursion check이있는 것이 매우 중요합니다.

+2

R2014b 현재 [공식 문서] (http://de.mathworks.com/help/matlab/graphics_transition/why-does-handle-listener-return-an-error-1.html)에 따르면'handle.listener '더 이상 일하지 않을 것이다. – embert

관련 문제