слушатель события matlab figure не срабатывает при изменении размера вдовы - PullRequest
0 голосов
/ 03 июля 2018

Версия : Matlab R2014b

Отказ от ответственности за проблему XY : моя цель состоит в том, чтобы сделать метки формата MATLAB в моей графике с помощью определенной пользовательской функции, которая принимает в качестве аргумента позицию тика и выводит строку. Размещение тиков по умолчанию в порядке, но я хочу контролировать метки. Невыполнение функции обратного вызова при изменении тиков приводит к ошибочно помеченным тикам.

MWE ниже показывает фиктивные версии обратного вызова; реальный обратный вызов устанавливает тиковые метки на вывод

tick_formatter = @(tv)([sprintf('%1.2f',tv/10^N) 'e' num2str(N)])

(где tv - значение тика в единицах X). (Это грубая замена ax.XAxis.Exponent версий R2015b и последующих, см. https://fr.mathworks.com/matlabcentral/answers/275054-change-multiple-exponent-on-x-axis)

Актуальная проблема :

Я хочу иметь возможность делать «что-то» (в моем случае пересчитывать метки тиков) каждый раз, когда тики меняются (то есть их число или их значение y изменяется). Для этого я посмотрел на addlistener, но мне не удалось заставить его работать так, как я хочу.

В идеале я бы добавил слушателя к свойству XTick, но, похоже, оно работает неправильно. Когда XTickMode установлен на auto, увеличение и уменьшение (программно xlim() или вручную) или изменение размера графического окна приведет к изменению числа / положения тиков и, следовательно, к изменению значения, возвращаемого get(ax,'XTick') , но это не вызовет такой прослушиватель событий.

Для увеличения или уменьшения масштаба, обходным путем является прослушивание XLim вместо этого, которое вызывает события; но я не нашел такого обходного пути для изменения размера окна рисунка (по крайней мере, с использованием слушателей на уровне объекта осей).

Любые предложения приветствуются.

MWE

% generate figure
x = 0:100;
y = x.^2;
figure(1)
clf() % ensure we cleared out previous tests
plot(x,y)
ax = gca();

% This event listener does nothing as you zoom in/out or resize the graphic
% window, even though XTick does change; it will only respond to explicit
% commands e.g. set(ax, 'XTick', ...). 
listen_to_XTick = addlistener(ax, 'XTick', 'PostSet',@(src,evn) disp('XTick changed'));

% This event listener responds to zooming in/out, but not to window
% resizing
listen_to_XLim = addlistener(ax, 'XLim', 'PostSet',@(src,evn) disp('XLim changed'));

% Play a bit with the figure, zoom in/out, resize the graphics window etc.
% -> only listen_to_XLim ever gets triggered, never listen_to_XTick

% Other properties that do not seem to ever trigger as window is resized:
% 'XTick', 'XTickLabel', 'Position'

1 Ответ

0 голосов
/ 03 июля 2018

Если вы хотите изменить метки тиков при изменении размера окна фигуры, вы можете использовать обратный вызов SizeChangedFcn самого окна figure . Попробуйте:

f = figure('SizeChangedFcn',@(src,evn) disp('Window resized'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...