Matlab如何创建多个Legend(图例)

本文介绍在Matlab中创建多个Legend的方法,包括一次性创建所有Legend及分别创建并精细调整位置的方法,使得图表更加清晰易读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:faaronzheng 转载请注明出处!
Matlab创建一个Legend非常简单,但是当创建两个甚至多个的时候就会遇到很多麻烦。接下来我们就介绍一下如何在Matlab中创建多个Legend。

%--------------------------------------plot
c1=plot(r1app(:, 1), r1app(:, 2), 'g.');    %r1app(:, 1) r1app(:, 2)都是矩阵
hold on;
c2=plot(r1test(:,1),r1test(:,2),'+g');
hold on;
% l1=legend('class1:train', 'class1:test',1);
% set(l1,'Orientation','horizon');
c3=plot(r2app(:, 1), r2app(:, 2), 'r.');
hold on;
c4=plot(r2test(:,1),r2test(:,2),'+r');
hold on;
c5=plot(r3app(:, 1), r3app(:, 2), 'b.');
hold on
c6=plot(r3test(:,1),r3test(:,2),'+b');
hold on;
%----------------------------------------Legend
%--------------------------------------method 1
%legend('class1:train','class1:test','class2:train','class2:test','class3:train','class3:test');
%--------------------------------------method 2
[legh,objh,outh,outm]=legend(c1,'class1:train');
set(legh,'Box','off');
set(legh,'position',[0.2,0.8,0.1,0.1]);

legh2=copyobj(legh,gcf);
[legh2,objh2]=legend(c2,'class1:test');
set(legh2,'Box','off');
set(legh2,'position',[0.4,0.8,0.1,0.1]);

 legh3=copyobj(legh2,gcf);
 [legh3,objh3,outh3,outm3]=legend(c3,'class2:train');
 set(legh3,'Box','off');
 set(legh3,'position',[0.2,0.75,0.1,0.1]);

legh4=copyobj(legh3,gcf);
 [legh4,objh4]=legend(c4,'class2:test');
 set(legh4,'Box','off');
 set(legh4,'position',[0.4,0.75,0.1,0.1]);

 legh5=copyobj(legh4,gcf);
 [legh5,objh5,outh5,outm5]=legend(c5,'class3:train');
 set(legh5,'Box','off');
  set(legh5,'position',[0.2,0.7,0.1,0.1]);

 legh6=copyobj(legh5,gcf);
 [legh6,objh6]=legend(c6,'class3:test');
 set(legh6,'Box','off');
   set(legh6,'position',[0.4,0.7,0.1,0.1]);

代码如上每一个Legend下面第一个set是用来取消Legend边框的,第二个set是固定Legend的位置,因为去掉边框后就不能用鼠标拖动Legend了,所以必须通过代码来设定Legend的位置。一定要记得在除第一个外每个Legend下使用copyobj()函数;不然会覆盖之前的Legend。

用method1产生的效果如下!
用method2产生的效果如下!

第二种是不是明显比第一种好看多了~~而且使用第二种方法可以创建任意多个Legend。

也可以参考我的百度经验:Matlab如何创建多个Legend

### Matlab 中处理多个图例重叠的解决方案 在 Matplotlib 和 MATLAB 的绘图环境中,当图表中有多个数据系列时,可能会遇到图例 (legend) 之间的相互覆盖问题。以下是针对该问题的具体解决方法: #### 方法一:调整图例位置 通过设置 `Position` 属性来手动调整每个图例的位置,从而避免它们互相覆盖。MATLAB 提供了灵活的方式来控制图例的位置。 ```matlab % 创建示例图形 figure; plot(1:10, 'DisplayName', 'Series 1'); hold on; plot(2:11, 'DisplayName', 'Series 2'); % 添加第一个图例并定位 hLegend1 = legend('show'); set(hLegend1, 'Position', [0.1, 0.7, 0.1, 0.1]); % 设置左上角坐标和大小[^1] % 隐藏默认图例以便添加第二个独立图例 delete(hLegend1); % 手动创建另一个图例 hLegend2 = annotation('textbox',... [0.8, 0.8, 0.1, 0.1],... % 定义右上角新图例位置 'String',{'Series 3'},... 'FitBoxToText','off',... 'EdgeColor',[0.5, 0.5, 0.5]); ``` 这种方法允许用户精确指定每个图例的位置,防止其与其他元素发生冲突。 --- #### 方法二:分组显示图例 如果不想让所有图例都挤在一个地方,则可以考虑将不同部分的数据分成若干子集,并分别标注对应的图例。 ```matlab % 绘制两条曲线作为一组 figure; ax1 = subplot(1, 2, 1); plot(ax1, rand(10, 1), 'b-', 'LineWidth', 2); hold on; plot(ax1, rand(10, 1)+1, 'r--', 'LineWidth', 2); lgdAx1 = legend({'Line A', 'Line B'}); % 另外绘制另外两线形成另一组 ax2 = subplot(1, 2, 2); plot(ax2, sin(linspace(-pi, pi)), 'g-.'); hold all; stem(ax2, cos(linspace(-pi/2, pi/2))); lgdAx2 = legend({'Sine Waveform', 'Cosine Samples'}); ``` 此方式利用子图功能把复杂的信息拆解开来呈现给读者更容易理解的形式[^1]。 --- #### 方法三:透明度调节 对于某些情况下无法完全分开各个标签的情况,可以通过降低背景颜色不透明度使得下面的内容隐约可见而不会被遮挡得太厉害。 ```matlab fig = figure(); axesHandle = axes(fig); lineHandles = arrayfun(@(i) plot(randn(1e3,1)*sqrt(i),'Parent',axesHandle,'DisplayName',['Data Set ',num2str(i)]), ... 1:4,... 'UniformOutput',false); legObj = legend([lineHandles{:}],'Location','BestOutsideRight'); set(legObj,'Interpreter','none') colormap(gray) alpha(legs,.6)%减少填充区域的Alpha值至约六成亮度 drawnow limitrate; %强制刷新屏幕以应用更改效果立即显现出来 ``` 这里展示了如何改变 alpha 值影响视觉感受的同时保持原有布局不变[^1]. --- ### 总结 以上三种策略——即重新安排图例座标、分割展示以及适当运用半透明白底技术均能有效缓解因过项目造成的拥挤状况。具体采用哪一种取决于实际需求和个人偏好。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值