MATLAB中的图例问题,求解释。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB中的图例问题,求解释。。相关的知识,希望对你有一定的参考价值。

hl=legend([repmat('\itl\rm=',n,1),num2str(t'),repmat('K',n,1)])

每一部分是什么意思?

repmat(A,m,n) 意思是将A矩阵复制m*n份,然后把这m*n份合成一个由m*n块A组成的矩阵;

>> A=[1 2;3 4];
>> repmat(A,3,2)
ans =
1 2 1 2
3 4 3 4
1 2 1 2
3 4 3 4
1 2 1 2
3 4 3 4

repmat('\itl\rm=',n,1) :'\it l \rm='这个是tex解释字符,\it设置字体为斜体,即把 l 设置为斜体;
\rm设置字体为正常字体,即斜体 l 之后内容设置为正常字体;然后把这个字符串复制n行一列;

repmat('K',n,1) :复制K为n行一列;

num2str(t')是将矩阵t转置后,然后把t的内容由数值转化为字符串;

然后 [ ]中括号的作用是将三部分组合在一起。
参考技术A repmat(M,m,n)这个函数的用处是构建一个新矩阵。新矩阵由m行M矩阵,n列M矩阵组成。

要知道‘XXX’,即字符串在matlab里面也是个矩阵,只不过是个1行,n列的矩阵。所以LZ的用法是没错的
repmat('\itl\rm=',n,1)相当于将'\itl\rm='重复n行。repmat('K',n,1)也一样

据我猜测t应该是个1行,n列的向量。于是t‘就是n行1列,然后用num2str将其转换为n行字符串,每行为'K'。
这样repmat('\itl\rm=',n,1),num2str(t'),repmat('K',n,1)就可以拼起来了。每一行为一个字符串。
可以由'\itl\rm= tK',其中t就是这一行的t值。
然后就是里面的一堆\it, \rm了。这些符号是tex的符号,各有其意义
\it代表斜体。\rm代表罗马字体。
于是 \itl\rm=就变成了斜体的l(看起来会和/差不多,但其实是小写的L),后面跟个罗马字体的=(其实打印出来和一般等号没啥区别)
最后是legend(M),M是个矩阵。legend由M的每一行各自生成一个图例。
根据上面的分析,M的每一行自然就是上面分析得到的字符串喽。
还有我都写了那么多了,你不加点悬赏就太不够意思了吧追问

同样谢谢你...你讲的很仔细,但是对我这个新手来说理解有点抽象...而且,我只有不到10分...
THANK YOU ALL THE SAME~

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

【中文标题】处理和消除 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中的图例问题,求解释。。的主要内容,如果未能解决你的问题,请参考以下文章

matlab BP神经网络训练程序求解释

图例中的变量名称,matlab

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

如何自定义matlab图例中的图片?

Matlab代码求解释,尤其是第二行和第六行(认知无线电频谱感知)

Matlab中for循环中的图例