Цвета легенды Matlab не соответствуют линиям
Не уверен, что здесь происходит не так. Я создал минимальный пример ниже:
clear
steps = 1:6;
labels = cell(length(steps),1);
xvals = 1:10;
fig = figure(1);
ax = axes('parent',fig);
hold on
for ii=1:length(steps)
s=steps(ii);
yvals = zeros(length(xvals)) + ii;
labels{ii} = ['gain = ' num2str(s)];
plot(ax,xvals,yvals);
end
legend(ax, labels);
hold off
И результат в моей системе:
С меньшим количеством линий он может даже добавить цвета в легенду, которых нет даже на сюжете. Что происходит?!
1 ответ
Объяснение того, что происходит
Проблема в линии
yvals = zeros(length(xvals)) + ii;
Это создает квадратную матрицу 10x10, а не вектор 1x10. plot
затем строит график каждого столбца этой матрицы xvals
, Это вызывает смешение цветов, что, вероятно, не то, что вы хотите.
Интересно проанализировать, что конкретно происходит. Matlab отображает каждый столбец этой матрицы другим цветом, используя цикл цветов по умолчанию, который в Matlab R2014b и далее
Но все столбцы этой матрицы одинаковы, поэтому каждый из них покрывает (перезаписывает) предыдущий, и вы видите только последний цвет.
Теперь в цветовом цикле 7 цветов, а в матрице 10 столбцов. Таким образом, в первой итерации последний столбец (тот, который вы видите) имеет цвет mod(10,7)==3
(Желтый). Во второй итерации вы перебираете еще 10 цветов, начиная с 3
цвет получается mod(3+10,7)==6
(светло-синий). И так далее. Таким образом, цвет, который вы видите на рисунке, зависит от индекса цикла ii
, но не так, как вы ожидали.
legend
создает свои записи, выбирая цвет (и спецификацию линии) каждой построенной линии в том порядке, в котором они были нанесены. Есть 10*6==60
построенные линии, каждая из которых соответствует столбцу матрицы. Но так как вы поставляете только шесть строк legend
, он просто выбирает первые шесть из этих линий и использует их цвета для создания записей легенды. Эти цвета следуют порядку по умолчанию, как описано выше.
Ни одна из тех первых шести линий, которые входят в легенду, на самом деле не видна на рисунке, потому что они покрыты другими линиями. Но legend
не заботится об этом. Таким образом, вы получите шесть записей легенды с порядком цвета по умолчанию, который, конечно, не соответствует линиям, которые вы фактически видите на графике.
Решение
Из вышесказанного решение понятно: заменили указанную строку на
yvals = zeros(1, length(xvals)) + ii;
создавать yvals
как вектор (не матрица). Таким образом, вы получите ожидаемую цифру: