【问题标题】:matlab figure event listener does not trigger when widow resized当寡妇调整大小时,matlab图形事件侦听器不会触发
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 接受,因为它解决了我的问题,但我会注意到它不是一个“正确”的解决方案:(1)如前所述,这是在玩弄 XTick 显然没有合适的监听器的事实,所以我们听所有可以改变 XTick 的东西; (2) 它链接到图形对象,而不是轴,这在某些情况下可能是一个问题(如果您更改图形中的轴位置,它不会回调;如果回调包含对轴对象属性的调用,如果您删除轴而不是图形,则会发生错误)。
    • 很高兴它有帮助。如果您还想涵盖其他情况,您可以简单地使用另一个侦听器触发相同的回调,例如您已经描述的侦听器 (addlistener(ax, 'XLim', 'PostSet',@(src,evn) disp('XLim changed'))。
    猜你喜欢
    • 2022-07-06
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多