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

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

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

Ответы

Ответ 1

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

ButtonDownFilter
ActionPreCallback
ActionPostCallback

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

Ответ 2

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

1. Установите функцию обратного вызова масштабирования в соответствии с by @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 самого объекта осей является хорошим местом, чтобы его в любое время занести.

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

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

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