【发布时间】:2018-07-03 13:11:45
【问题描述】:
版本: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'
【问题讨论】:
标签: matlab graphics event-listener