寡妇调整大小时,matlab图形事件侦听器不会触发

时间:2018-07-03 13:11:45

标签: matlab graphics event-listener

版本:Matlab R2014b

XY问题免责声明:我的目标是使用特定的自定义函数在图形中生成MATLAB格式的刻度,该自定义函数将刻度位置作为参数并输出一个字符串。默认刻度线可以,但是我想控制标签。由于滴答声变化而无法执行回调函数会导致标签错误的滴答声。

下面的MWE显示了回调的虚拟版本;真正的回调将刻度标签设置为

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

(其中tv是以X为单位的刻度值)。 (这是对版本R2015b及更高版本的ax.XAxis.Exponent的粗略替代,请参见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 :(得分:0)

如果在调整图形窗口大小时想要更改刻度标签,则可以使用figure窗口本身的SizeChangedFcn回调。试试:

f = figure('SizeChangedFcn',@(src,evn) disp('Window resized'))