2015-02-25 3 views
2

Я использую matlab для построения некоторых рисунков проекта, см. Рисунок удара. Теперь я пытаюсь вырезать ширину легенды, чтобы линия не выглядела так широко. Я попробовал эти команды, как предполагают, по Benoit_11:Как уменьшить ширину легенды в matlab

[~,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) 

Я использую для цикла построить эти цифры, потому что у меня есть несколько цифр для анализа одновременно. Теперь я могу изменить длину линии легенды прямо сейчас. Но у меня возникла еще одна проблема: если у меня есть другая длина текста легенды, даже если бы я установил ту же начальную точку и конечную точку, в конце я получу разную длину (это видно из рисунков). Я попытался изменить значок (1), но всегда получал ошибку. Какие-либо предложения? enter image description here

ответ

-1

Необходимо установить значение свойства Position, вы можете просто изменить вектор p. p не влияет на график вообще, это всего лишь вектор чисел. Вы должны изменить его, а затем применить его обратно к сюжету, используя

set(size,'Position',p) 

Там, как представляется, минимальная ширина легенды, однако.

+0

Я пытался, но он не делает работу. –

2

Есть 2 вещи, которые вы не делаете прямо с кодом (кроме того, что вы используете size как ручку к легенде ... это опасно, потому что size является встроенной функцией):

1) Вызов legend, содержащий только один аргумент, возвращает дескриптор объекта легенды, и его позиция фактически дает вам положение поля, содержащего легенду, то есть текст + строку.

2) Используя эту строку:

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

ли изменить положение, однако вам нужно будет установить новое положение легенды с чем-то вроде следующего за изменения, чтобы быть эффективными:

set(HandleToLegend,'Position',p) 

Чтобы вернуться к вашему вопросу, трюк заключается в назначении многих выходов во время вызова legend; вы можете затем модифицировать определенные элементы объекта легенды.

На самом деле нам нужно только 1 из 4 выходных аргументов, называемых 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) 

Что дает следующее:

enter image description here

+0

Это работает как волшебство. Кроме того, есть способ также приблизить текст к сокращенной линии? –

+0

Кроме того, почему вы выбрали второй элемент для {icon}? Я изменил его на 1-й и 3-й элементы, но получил ошибку. Я пытаюсь понять ваш магический код. –

+0

haha ​​жаль, что вчера было поздно, я думал, что объяснил лучше :) Пожалуйста, посмотрите на отредактированный ответ. Надеюсь, теперь он станет яснее. –

Смежные вопросы