将图例与轴对象匹配

语境:

我有一个(编程)GUI,它包含一些uipanel父母结构中的几个axes对象。 其中一些axes具有关联的legend对象,有些则不具有。
我想在我的GUI中包含一个按钮,它将当前可见的情节复制到一个新图形中,如果它包含legend话。

我知道如何获取当前可见的uipanel和其中的所有axes对象的句柄。 我也知道如何将axeslegend分开。

题:

我如何将legendaxes 匹配

例如,在一种情况下,我的GUI显示2个axes ,每个axes图都有自己的legend 。 当我点击'导出'按钮时,我想要创建2个新数字,每个数字都包含一个带有相应legend axes
我目前能够做的是

  • 把所有东西都放在一个图中(它们在这种情况下重叠,因为它们在原始的uipanel的位置是相同的),
  • 将每个轴和每个图例分别放入各自的图形中,
  • 将所有坐标轴放在一个图形中,并将所有坐标图放入另一个图形中
  • 将所有坐标轴放在同一个面板中的所有图例中。
  • 按小组进行分组,即将所有小区放入同一个图中,并将每组小区放入他们自己的图中。
  • 问题:

    问题是,我没有这些对象的句柄。 我只有uipanel对象的句柄。 面板内的图形由另一个函数构建,其中包含各种棘手的东西,但不返回句柄。 所述面板的父母结构使得用像get(handles.panels{1},'Children')这样的技巧很难做到这一点,因为它可以在一些情况下工作,但不是所有情况。
    我想过简单地导出面板(并且实际上有一个工作版本),但是这有几个问题,主要与图形工具和调整大小有关。 当我使用“导出”按钮时,我想摆脱面板。

    代码片段/示例:

    以下代码片段将创建一个示例GUI,可以访问我在完整的GUI中访问的所有句柄。 点击按钮将显示我得到“工作”的不同版本。 我想要的是每个轴的一个数字,包括它的图例,如果有的话。 第四个版本(同一个父代)接近,但如果它遇到subplot s会中断,第五个版本(通过面板)只是将整个子区块组放入一个窗口(在这种情况下,至少它们不会重叠)。 将代码复制到一个新的.m文件中进行试用。

    function test
        figure(1)
        clf
        t=(0:0.1:10)'; %'// dummy comment
        p2 = uipanel('Visible','off','Position',[0 0 1 1]);
        p1 = uipanel('position',[0 0 1 1]);
        p11 = uipanel('Parent',p1,'Position',[0 0 0.5 0.9]);
        p12 = uipanel('Parent',p1,'Position',[0.5 0 0.5 0.9]);
        uicontrol('Style','push','String','all in one','Units','norm',...
            'Position',[0.05 0.91 0.14 0.06],'Callback',@export1);
        uicontrol('Style','push','String','all in own','Units','norm',...
            'Position',[0.24 0.91 0.14 0.06],'Callback',@export2);
        uicontrol('Style','push','String','by type','Units','norm',...
            'Position',[0.43 0.91 0.14 0.06],'Callback',@export3);
        uicontrol('Style','push','String','same parent','Units','norm',...
            'Position',[0.62 0.91 0.14 0.06],'Callback',@export4);
        uicontrol('Style','push','String','same panel','Units','norm',...
            'Position',[0.81 0.91 0.14 0.06],'Callback',@export5);
        subplot(1,1,1,'Parent',p11)
        plot(t,[sin(t) cos(t)])
        legend('Sine','Cosine')
        subplot(2,1,1,'Parent',p12)
        plot(t,[polyval([0.05 -1 2],t) exp(-t) abs(t-3)])
        subplot(2,1,2,'Parent',p12)
        plot(t,erf(t))
        legend('Error function')
    
        function export1(~,~)
            current = findobj('Type','uipanel','Parent',1,'Visible','on');
            visible_axes = findobj(current,'Type','axes');
            copyobj(visible_axes,figure);
        end
    
        function export2(~,~)
            current = findobj('Type','uipanel','Parent',1,'Visible','on');
            visible_axes = findobj(current,'Type','axes');
            for i=1:length(visible_axes)
                copyobj(visible_axes(i),figure);
            end
        end
    
        function export3(~,~)
            current = findobj('Type','uipanel','Parent',1,'Visible','on');
            visible_axes = findobj(current,'Type','axes','Tag','');
            visible_legends = findobj(current,'Tag','legend');
            copyobj(visible_axes,figure);
            copyobj(visible_legends,figure);
        end
    
        function export4(~,~)
            current = findobj('Type','uipanel','Parent',1,'Visible','on');
            visible_axes = findobj(current,'Type','axes','Tag','');
            visible_legends = findobj(current,'Tag','legend');
            for i=1:length(visible_axes)
                par = get(visible_axes(i),'Parent');
                same = findobj(visible_legends,'Parent',par);
                h=figure;
                copyobj(visible_axes(i),h)
                copyobj(same,h)
            end
        end
    
        function export5(~,~)
            current = findobj('Type','uipanel','Parent',1,'Visible','on');
            visible_axes = findobj(current,'Type','axes');
            parents = cell2mat(get(visible_axes,'Parent'));
            uparents = unique(parents);
            for i=1:length(uparents)
                copyobj(visible_axes(parents==uparents(i)),figure)
            end
        end
    end
    

    在一个图中,图形对象是分层组织的,可以单独处理。 例如,坐标轴是一个图的孩子,坐标图是一个坐标轴的孩子,图例是坐标轴。

    以下示例绘制2行(红色和蓝色,带有图例),然后使用copyobj混合绘图和图例。

    figure;
    subplot(1,2,1)
    hp1 = plot(1:10,'r')
    hl1 = legend('red')
    
    subplot(1,2,2)
    hp2 = plot(1:10,'b')
    hl2 = legend('blue')
    
    hf = figure;
    hax = axes;
    copyobj(hp1, hax);    %copy plot to axes
    copyobj(hl2, hf);     %copy legend to figure
    

    虽然没有用GUI进行测试。


    我认为更简单的解决方案是将您要保存的图形的轴保存为无花果文件。

    h = figure(1);
    
    x = linspace(1,100);
    y = 2*x;
    
    ax = findall(h,'type','axes');
    plot(x,y);
    
    save('youraxes', 'ax');
    hgsave(h, 'yourfig.fig');
    

    我正在使用Matlab R2012a,或者在R2013a或b中保存无花果的功能现在可以savefig


    一旦你获得了轴柄,你可以找到相应的图例柄

    legend_handle = legend(axes_handle)

    链接地址: http://www.djcxy.com/p/18989.html

    上一篇: Match legend to axes objects

    下一篇: BluetoothAdapter.startScan() vs BluetoothAdapter.startLeScan()