Версия : 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'