MatLab图例中多个项目的处理和消除

MatLab图例中多个项目的处理和消除,matlab,plot,legend,Matlab,Plot,Legend,我目前想有图形的图例,但是我绘制了几条线,这些线应该只有3种类型 我目前的选择是在边界外使用虚拟绘图,绘制相关数据,并在末尾调用图例。它可以工作,但容易出错。我想更新图例,只选择几个情节 我试图使用leg\u handle.String,但随后出现了两个问题: 它仍然打印5个句柄,而不是3个 它没有正确的线条样式和颜色 有什么想法吗 下面是代码(带注释的虚拟图)和当前版本的图片,给出了错误和我想要查看的内容 clear figure() hold on %using %dummy plot

我目前想有图形的图例,但是我绘制了几条线,这些线应该只有3种类型

我目前的选择是在边界外使用虚拟绘图,绘制相关数据,并在末尾调用图例。它可以工作,但容易出错。我想更新图例,只选择几个情节

我试图使用
leg\u handle.String
,但随后出现了两个问题:

  • 它仍然打印5个句柄,而不是3个

  • 它没有正确的线条样式和颜色

  • 有什么想法吗

    下面是代码(带注释的虚拟图)和当前版本的图片,给出了错误和我想要查看的内容

    clear
    figure()
    hold on 
    
    %using
    %dummy plot
    % leg_text={'a','b','c'};
    % plot(100,100,'-r')
    % plot(100,100,'-b')
    % plot(100,100,'-k')
    
    for ii=1:20,
    plot(1:11,linspace(0,ii,11),'-r')
    end
    for ii=30:50,
    plot(1:11,linspace(0,ii,11),'-b')
    end
    for ii=70:80,
    plot(1:11,linspace(ii,25,11),'-k')
    end
    
    Yaxl=[-1 80];
    Xaxl=[1 11];
    set(gca, 'Visible','on',                         ...
                 'Box','on',                             ...
                 'Layer','top',...
                 'Xlim',Xaxl, ...
                 'Ylim',Yaxl); 
    
    %using
    % legend(leg_text)
    
    %want to use
    leg_hand=legend(gca,'show');
    leg_hand.String=leg_hand.String([1 21 42]);
    %extra comand will give the things that i wanted above
    % leg_hand.String=leg_hand.String([1 2 3]);
    
    它提供了什么:

    我期望得到的:


    我尝试过使用
    [a,b,c,d]=legend
    ,但这只提供了我已经使用过的
    a
    句柄。

    这个小解决方法应该可以完成以下工作:

    clear();
    
    figure();
    hold on;
    
    h = gobjects(3,1);
    
    for ii = 1:20
        h(1) = plot(1:11,linspace(0,ii,11),'-r');
    end
    
    for ii = 30:50
        h(2) = plot(1:11,linspace(0,ii,11),'-b');
    end
    
    for ii = 70:80
        h(3) = plot(1:11,linspace(ii,25,11),'-k');
    end
    
    set(gca,'Box','on','Layer','top','Visible','on','Xlim',[1 11],'Ylim',[-1 80]); 
    legend(h,'A','B','C');
    
    hold off;
    

    事实上,我做的很简单。我使用创建了一个大小为
    3
    (每次迭代一个)的图形对象数组。然后,在每次迭代中,我将最后绘制的线指定给其各自的数组占位符。最后,我使用之前存储的三个图形对象创建了图例

    或者:

    clear();
    
    figure();
    hold on;
    
    h1 = gobjects(20,1);
    
    for ii = 1:20
        h1(ii) = plot(1:11,linspace(0,ii,11),'-r');
    end
    
    h2 = gobjects(21,1);
    
    for ii = 30:50
        h2(ii-29) = plot(1:11,linspace(0,ii,11),'-b');
    end
    
    h3 = gobjects(11,1);
    
    for ii = 70:80
        h3(ii-69) = plot(1:11,linspace(ii,25,11),'-k');
    end
    
    set(gca,'Box','on','Layer','top','Visible','on','Xlim',[1 11],'Ylim',[-1 80]); 
    legend([h1(1) h2(1) h3(1)],'A','B','C');
    
    hold off;
    

    创建一个图形对象数组,用于存储每次迭代生成的打印处理程序。然后,使用每个图形对象数组的第一个(基本上是任何)项创建图例。

    我不知道
    gobjects
    ,这种方法正是我想要的。已经在用了。碰巧,你们知道为什么我使用
    leg\u handle.String
    时它会给出错误的输出吗?若你们看到
    leg\u hand.String
    在使用你们的方法创建图例之后包含了什么,你们会注意到它类似于
    {'data1'…'data50'}
    。问题是图例中已经包含了太多的句柄条目,它们的名称不是您要查找的。您可以更改显示的字符串、数据和元素数,但这不会使图例正确。请查看答案。@Dev-iL,谢谢。你的方法也很有趣。