Matlab выполняет обратный вызов, когда график масштабируется / изменяется или перерисовывается? - PullRequest
15 голосов
/ 09 февраля 2011

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

Предоставляет ли Matlab хуки для обновления данных при изменении вида?(Или просто когда перерисовывается?)

Ответы [ 2 ]

17 голосов
/ 31 января 2013

Хотя мне еще не удалось найти один общий обратный вызов «перерисовки» для решения этого вопроса, мне удалось собрать группу из четырех обратных вызовов *, которые, кажется, достигают этой цели (почти?) Во всех ситуациях. Для заданного объекта оси ax = gca(),

1. Настройте функцию обратного вызова масштабирования в соответствии с указаниями от @ Jonas :
set(zoom(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

2. Настройка функции обратного вызова панорамирования :
set(pan(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

3. Настройте функцию обратного вызова изменения размера фигуры :
set(getParentFigure(ax),'ResizeFcn',@(x,y) myCallbackFcn(ax));

4. Редактировать: эта функция больше не работает в R2014b, но необходима только в том случае, если вы добавите, например, цветовую полосу к фигуре (которая изменяет положение оси без изменения размера фигуры или увеличения / панорамирования оси). Я не искал замены. Наконец, настройте прослушиватель недокументированного свойства для самого свойства положения осей. Здесь есть один важный трюк: мы должны держаться за дескриптор объекта handle.listener, так как после удаления (или выхода из области действия) он удаляет обратный вызов. Свойство UserData самого объекта axes является хорошим местом для его хранения во многих случаях.

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

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

* Кроме того, с таким большим количеством различных источников обратного вызова, я считаю неоценимым иметь проверку рекурсии в начале myCallbackFcn, чтобы гарантировать, что я не попаду в бесконечный цикл .

9 голосов
/ 09 февраля 2011

Да, это так.Объект режима ZOOM имеет следующие обратные вызовы:

ButtonDownFilter
ActionPreCallback
ActionPostCallback

Последние два выполняются либо непосредственно перед, либо сразу после функции масштабирования.Вы можете установить функцию обновления в ActionPostCallback, где вы будете обновлять график в соответствии с новыми пределами осей (дескриптор осей передается в качестве второго входного аргумента для обратного вызова).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...