Цвета легенды 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 как вектор (не матрица). Таким образом, вы получите ожидаемую цифру:

Другие вопросы по тегам