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

Posted

技术标签:

【中文标题】处理和消除 MatLab 图例中的多个条目【英文标题】:Handling and eliminating multiples entries in MatLab legend 【发布时间】:2018-08-19 18:50:40 【问题描述】:

我目前想要图例,但是我正在绘制几条线,应该只分成 3 种类型。

我目前的选择是在边界之外使用 虚拟图,绘制相关数据并在最后调用图例。它有效,但容易出错。我想更新图例并只选择一些图。

我尝试使用leg_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 的this method,但这只给出了我已经在使用的a 句柄。

【问题讨论】:

看看this的回答。 @Dev-iL,谢谢。你的方法也很有趣。 【参考方案1】:

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

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;

其实我做的很简单。我使用gobjects function 创建了一个大小为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_handle.String 时它会给出错误的输出吗? 如果您在使用您的方法创建图例后看到leg_hand.String 包含的内容,您会注意到它类似于'data1' ... 'data50'。问题是图例已经包含太多句柄条目,它们的名称不是您要查找的。您可以更改字符串、数据和显示的元素数量,但这不会使您的图例正确。

以上是关于处理和消除 MatLab 图例中的多个条目的主要内容,如果未能解决你的问题,请参考以下文章

使用多个几何图形时如何消除ggplotly重复的图例条目

MATLAB Plot - 多个数据行的图例条目 - getcolumn

如何在绘图本身中添加 Matlab 中的图例元素

来自单元格的 Matlab 图例,用于使用 for 循环创建的绘图

如何在 MATLAB 中将图例条目强制为 10 的幂

Matlab:更改图例中条目的顺序