我正在扩展Expand (maximise) subplot figure temporarily — then collapse it back处提出的问题 - 我试图将其作为对原始帖子的评论发布,但我没有足够的权限。
我在评论中使用了该版本:
function gcaExpandable
set(gca, 'ButtonDownFcn', [...
'set(copyobj(gca, uipanel(''Position'', [0 0 1 1])), ' ...
' ''Units'', ''normal'', ''OuterPosition'', [0 0 1 1], ' ...
' ''ButtonDownFcn'', ''delete(get(gca, ''''Parent''''))''); ']);
end
在Matlab 2013b中完美运行。但是,我现在在2015b,当我尝试使用相同的按钮功能时,我得到以下内容:
Error using gcaExpandable
Too many input arguments.
Error while evaluating Axes ButtonDownFcn
我目前不知道究竟是什么引发了错误。我试图通过基于文档向copyobj添加'legacy'标志来修复它:
copyobj(___,'legacy') copies object callback properties and object
application data. This behavior is consistent with versions of copyobj
before MATLAB® release R2014b.
但这根本不会改变行为。如果有人能够找出导致错误的原因或如何使这个非常有用的功能适应2015b,那将是非常有帮助的!感谢。
答案 0 :(得分:0)
这个适用于MATLAB R2017a:
set(gca, 'ButtonDownFcn',@(ax,~)set(copyobj(ax,uipanel('Position',[0,0,1,1])),...
'Units','normal', 'OuterPosition',[0,0,1,1],
'ButtonDownFcn',@(co,~)delete(get(co,'parent'))));
您可以将其放在gcaExpandable
函数中,如OP中那样。
OP中代码的最大区别在于使用匿名函数。回调有两个输入参数,第一个是回调对象(点击的东西),第二个可以忽略,但必须出现在函数定义中(因此~
,它表示一个被忽略的参数)
通过使用匿名函数而不是要计算的字符串,语法更清晰(没有双引号)。
在Octave下,copyobj
函数的工作方式不同。要使相同的代码生效,您需要在回调中使用多个语句。为此,有必要将回调函数定义为常规的命名函数,并将其句柄作为回调传递:
function gcaExpandable
set(gca,'ButtonDownFcn',@callback);
function callback(ax,~)
panel = uipanel('Position',[0,0,1,1]);
newax = copyobj(ax,panel);
set(newax,'Units','normal', 'OuterPosition',[0,0,1,1], ...
'ButtonDownFcn',@(~,~)delete(panel))
(上述两个函数在同一个文件gcaExpandable.m
中定义。)
请注意,代码也更加清晰,将它们全部定义为单行代码没有任何优势。该版本也适用于MATLAB。