2016-06-22 6 views
2

я использовал следующий код для генерации моего участка (и я хочу его позже включить в моем LATEX документе):Matlab легенда не соответствует сюжету

clear all; close all; clc; 
a1 = 1; a2 = 1; c1 = 2.0; c2 = 1.8; time = 0:0.1:300; 
wave1 = a1 * sin(c1*time); 
wave2 = a2 * sin(c2*time); 
wave3 = wave1 + wave2; 

y = hilbert(wave3); 
env = abs(y); 

bound = 0.1*cos(0.2*time-pi); 

plot(time,wave3,'k',time,[-1;1]*env,'--k',time,bound,'-.r', 'Linewidth',1.2); 

ylabel(' $\eta$ (m)'); 
xlabel(' Time (s)'); 
legend = legend({'Short waves','Wave group envelope','Bound long wave'}); 
set(legend, 'FontSize',20); 
axis([15.7 110 -2.5 2.5]); 

График выглядит следующим образом:

enter image description here

Очевидно, что легенда 'bound long wave' не соответствует спецификации цвета и линии на графике. Насколько я знаю, это как-то связано со скалярным/вектором, но я не могу понять, где ошибка.

Как продолжить?

ответ

2

Фактически вы создаете четыре объекта сюжета, но только для легенды для трех из них. Если мы сломаем ваш оператор plot, мы можем подсчитать графики (имея в виду, что plot вызывается с матричными графиками каждый столбец как другой сюжет).

plot(time, wave3, 'k', ...   <--- This is one plot 
    time, [-1;1]*env, '--k', ... <--- This is TWO plots (one negative, one positive) 
    time, bound, '-.r', ...  <--- This is one plot 
    'Linewidth',1.2); 

При вызове legend только с тремя этикетками, он только собирается создать запись легенды для первых трех объектов сюжета.

Поскольку вы, вероятно, не хотите использовать две записи для конверта, вы должны присвоить значение plot переменной и pass the handles explicitly to the legend.

p = plot(time, wave3, 'k', ... 
     time, [-1; 1] * env, '--k', ... 
     time, bound, '-.r', ... 
     'LineWidth', 1.2); 

% Skip the third plot since that will just be the "negative" envelope 
legend(p([1 2 4]), {'Short waves','Wave group envelope','Bound long wave'}); 

enter image description here