4

通常在 Matlab 中,我们会绘制一个带有许多子图轴的图形,但它们都很小。

在流行的 UX 范例中,您希望能够双击这样一个小图以使用整个屏幕空间仔细查看。

通常这就是我避免使用的原因subplot,而是绘制许多单独的图形——所以我可以在屏幕上移动它们并双击它们的标题栏(在 Windows 上)将图形最大化到全屏。(再次双击,它会恢复到正常大小。)

然而, 的优点subplot是一组图被分组在一个面板中。当我绘制许多这样的组(每个组都有十几个单独的子图轴)时,拥有这么多单独的图形变得难以处理。

那么,有没有办法在 Matlab 中启用此功能?

4

1 回答 1

1

结合 三篇 文章的部分内容,这是我目前所拥有的:

h = subplot(2,2,1);
line(1:10, rand(1,10));
set(h, 'buttondownfcn', ['h=gca; hc = copyobj(h, gcf);' ...
    'set(hc, ''Units'', ''normal'',' ...
    ' ''Position'', [0.05 0.1 0.8 0.85],' ...
    ' ''buttondownfcn'', ''delete(gca)'');']);

它并不完美,但它有效。

在此处输入图像描述

单击轴:

在此处输入图像描述

单击展开的轴,它会消失:

在此处输入图像描述

请注意,这仍然允许您平移、缩放和“旋转 3D”结果轴。选择箭头工具实际上会进入“编辑模式”,因此最好取消选择您正在使用的工具。例如:如果您正在放大,请再次单击放大图标以取消选择该工具。然后单击将“折叠”轴的爆炸。

到目前为止的限制是您有时可以看到下面的底层小子图轴的一部分。如果有人可以推荐一种优雅的方式来隐藏它们,那将是一个很好的改进。


编辑这个答案中学习(使用 auipanel来防止其他内容显示出来),我现在已经把解决方案变成了这个:

gcaExpand.m

function gcaExpand

    set(copyobj(gca, uipanel('Position', [0 0 1 1])), ...
       'Units', 'normal', 'OuterPosition', [0 0 1 1], ...
       'ButtonDownFcn', 'delete(get(gca, ''Parent''))'); 

end

gcaExpandable.m

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 函数一起放入目录中。以上也可以包含在要发送的函数中。

最初,我打算编写一个自动subplot应用的自定义版本gcaExpandable,但这不起作用,因为诸如plot擦除ButtonDownFcn属性(以及除位置之外的所有其他属性)之类的命令。根据这个答案NextPlot,我们可以通过更改to来避免重置这些属性'replacechildren',但这有副作用。例如,plot不再自动重新缩放轴。因此,到目前为止,最干净的解决方案似乎如上所述。

于 2014-08-13T05:11:40.273 回答