Выполняет ли 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
чтобы я не закончил бесконечный цикл.