我正在使用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)但总是得到错误。有什么建议?
答案 0 :(得分:3)
有两件事情你的代码没有做得正确(除了你使用size
作为传奇句柄的事实......因为size
是一个风险因素内置功能):
1)仅使用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)
其中包含以下内容:
答案 1 :(得分:-1)
您需要设置Position
属性的值,您只需更改向量p
即可。 p
根本不影响情节,它只是一个数字向量。您必须修改它,然后使用
set(size,'Position',p)
然而,传奇似乎确实存在最小宽度。