如何在Matlab中减小图例宽度。

3

我正在使用matlab绘制一些项目图表,如下图所示。现在我想要缩小图例的宽度,以便线条看起来不那么宽。我尝试了Benoit_11建议的以下命令:

[~,icons,~,~] = legend(leg,'location','northwest');
hline = icons(2);
linedata = get(hline,'xdata');
newdata = [linedata(1)+0.2 linedata(2)];
set(hline,'xdata',newdata,'linewidth',1)

我正在使用for循环绘制这些图形,因为我需要同时分析多个图形。现在我可以改变图例线的长度。但我遇到了另一个问题:如果我的图例文本长度不同,即使我设置了相同的起点和终点,最终得到的线的长度也会有所不同(您可以从图中看出)。我尝试修改icon (1) 但总是出错。有什么建议吗? 输入图像描述
2个回答

3

您的代码中有两个问题(除了您使用 size 作为图例句柄的事实...这很危险,因为 size 是一个内置函数):

1) 只使用一个参数调用 legend 将返回一个指向图例对象的句柄,获取其位置实际上会给您盒子的位置,即文本+线条。

2) 使用以下行:

p(3) = p(3) - 0.06;

虽然修改了位置,但您需要使用类似以下代码来设置图例的新位置,以使更改生效:

set(HandleToLegend,'Position',p)

回到你的问题,诀窍是在调用legend时分配多个输出;然后可以修改图例对象的特定元素。
实际上我们只需要4个输出参数中的1个,称为文档中的icons,所以我会坚持这种表示法。然后,我们可以获取线条的XData属性并按需修改它。实际上,XData是一个2元向量:
[StartingPoint EndingPoint]

所以改变其中一个或两个(或者同时更改)将会改变图例框中显示的线条长度。

这里是完整的代码和注释;我改变了第二个图中线条的长度和宽度,以突出变化。

clear
clc
close all
x = 1:10;
y = rand(1,10);
figure;

%// Default case
subplot(1,2,1)
plot(x,y);

legend('First plot','Location','NorthWest');

title('Before','FontSize',18);

%// With modifications
subplot(1,2,2)
plot(x,y);
title('After','FontSize',18);

%//========================
%// Change the legend here
%//========================

%// The "icons" output is what you want
[~,icons,~,~] = legend('First plot','Location','NorthWest');

%// icons(1) is the text of the current element in the legend Here its 'First plot'
i_1 = get(icons(1)); %// access the properties with this command.

%// icons(2) is the line associated with that text. Here the blue line.
i_2 = get(icons(2));

%// Mhh I don't know what icons(3) represents haha sorry about that.
i_3 = get(icons(3));


%// Get the actual line
hline = icons(2);

%// Fetch its XData property
LineData = get(hline,'XData')

%// Play with those 2 elements to see the output change.
NewData = [LineData(1)+.2 LineData(2)-.01];

%// Apply the changes
set(hline,'XData',NewData,'LineWidth',3)

Which gives the following:

enter image description here


这就像魔法一样。另外,有没有办法让文本更接近缩短的行? - Jianli Cheng
另外,为什么你选择了第二个元素作为 {icon} 的值?我将其改为了第一个和第三个元素,但是出现了错误。我正在尝试理解你的神奇代码。 - Jianli Cheng
哈哈,对不起,昨天太晚了,我以为我解释得更好:) 请看编辑后的答案,希望现在更清楚了。 - Benoit_11
我已经尝试了一下linedata中的2个元素,并且现在可以更改图例线的长度。但是我又遇到了另一个问题:如果我有不同长度的图例文本,即使我设置相同的起点和终点,最终获得的线的长度也会不同。我尝试修改icon(1),但总是出现错误。 - Jianli Cheng

-1
你需要设置Position属性的值,只需更改向量p即可。 p不会影响绘图,它只是一个数字向量。 您必须修改它,然后将其应用回绘图中,使用
set(size,'Position',p)

不过,图例的最小宽度似乎确实存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接