MATLAB中的图例问题,求解释。。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB中的图例问题,求解释。。相关的知识,希望对你有一定的参考价值。
hl=legend([repmat('\itl\rm=',n,1),num2str(t'),repmat('K',n,1)])
每一部分是什么意思?
>> 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中的图例问题,求解释。。的主要内容,如果未能解决你的问题,请参考以下文章