Matlab 将图例与轴对象匹配 背景:

Matlab 将图例与轴对象匹配 背景:,matlab,legend,axes,Matlab,Legend,Axes,我有一个(编程的)GUI,它在一些uipanelparenting结构中包含几个axes对象。其中一些轴具有关联的图例对象,而一些没有关联。 我想在我的GUI中包括一个按钮,该按钮将当前可见的绘图复制到一个新图形中,包括其图例(如果有) 我知道如何获取当前可见的ui面板和其中所有轴对象的句柄。我还知道如何区分轴和图例s 问题: 如何将图例与轴匹配 例如,在一种情况下,我的GUI显示了2个轴,带有一些图,每个图都有自己的图例。当我单击“导出”按钮时,我希望创建两个新图形,每个图形包含一个轴,以及相

我有一个(编程的)GUI,它在一些
uipanel
parenting结构中包含几个
axes
对象。其中一些
具有关联的
图例
对象,而一些没有关联。
我想在我的GUI中包括一个按钮,该按钮将当前可见的绘图复制到一个新图形中,包括其
图例(如果有)

我知道如何获取当前可见的
ui面板
和其中所有
对象的句柄。我还知道如何区分
图例
s

问题: 如何将
图例
匹配

例如,在一种情况下,我的GUI显示了2个轴,带有一些图,每个图都有自己的图例。当我单击“导出”按钮时,我希望创建两个新图形,每个图形包含一个
,以及相应的
图例

我现在能做的是

  • 将所有内容放在一个图中(在这种情况下,它们重叠,因为它们在原始
    ui面板中的位置相同)
  • 将每个轴和每个图例放入各自的图形中
  • 将所有轴放在一个图形中,将所有图例放在另一个图形中,然后
  • 将所有轴放在它们自己的图形中,并将所有图例放在同一面板中
  • 按面板分割,即将所有子地块放在同一个图形中,每组地块放在各自的图形中
  • 问题: 问题是,我没有这两个对象的句柄。我只有
    ui面板
    对象的句柄。面板内的图形是由另一个函数构建的,该函数包含各种棘手的内容,但不返回句柄。此外,上述面板的家长结构使得使用
    get(handles.panels{1},'Children')
    等技巧很难做到这一点,因为它在某些情况下有效,但并非在所有情况下都有效。
    我曾考虑过简单地导出面板(实际上有一个可以这样做的工作版本),但这有几个问题,主要与图形工具和调整大小有关。我想在使用“导出”按钮时去掉面板

    代码片段/示例: 下面的代码片段将创建一个示例GUI,可以访问我在完整GUI中可以访问的所有句柄。点击按钮将显示我开始“工作”的不同版本。我想要的是每个轴都有一个图形,包括它的图例(如果有)。第四个版本(同一个父版本)很接近,但如果遇到
    子批次
    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
    

    在图形中,图形对象是按层次组织的,可以单独处理。例如,轴是图形的子对象,绘图是轴的子对象,图例构建为轴

    下面的示例绘制两行(红色和蓝色,带有图例),然后使用
    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进行测试。

    我认为更简单的解决方案是将要保存的图形的轴保存为fig文件

    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\u handle=legend(axes\u handle)

    问题是,我无法访问您示例中的
    hl1
    hl2
    。因此,我稍后将尝试检索它们。设想您的第一个图形(带有子图)被保存为
    .fig
    ,并在另一个函数/脚本/会话中重新打开。那你就没有把手了。在这种情况下,您将如何实现相同的目标(或实际复制匹配的目标,但旋转方向相同)?保存图形将保存所有子轴,包括图例。我不明白为什么在你的场景中情节/传说是分离的。此外,只要调用
    legend
    ,您就可以根据图形重新创建图例。最后,您可以使用
    set(gcf,'UserData',legend_handle)
    将图例数据嵌入图形中,以便稍后检索。它们没有分离,我想分离它们。我想打开包含子地块图形的
    .fig
    ,然后创建一个仅包含红色轴(包括其图例)的新图形。我无法将图例句柄保存在
    UserData
    中,因为我从一开始就没有得到它。图形是由一个我无法更改的外部函数创建并加载到
    uipanel
    对象中的。该函数不会返回图例句柄。这对解决问题有何帮助?如果你指的是我对麦克达夫回答的评论,那只是一个简单的例子来说明我想做什么。这与我的实际问题无关。