Matlab legend colors don't match lines

末鹿安然 提交于 2019-12-13 17:11:38

问题


Not sure what is going wrong here. I created a minimal example below:

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

And the result on my system is:

With less lines it can even put colors in the legend that aren't even on the plot. What is happening?!


回答1:


Explanation of what's happening

The problem is in the line

yvals = zeros(length(xvals)) + ii;

This creates a 10x10 square matrix, not a 1x10 vector. plot then plots each column of that matrix against xvals. That causes a mixing up of colors which is probably not what you want.

It's interesting to analyze specifically what happens. Matlab plots each column of that matrix with a different color, using the default cycle of colors, which in Matlab R2014b onwards is

But all columns of that matrix are the same, so each covers (overwrites) the preceding one, and you only see the last color.

Now, the color cycle has 7 colors and the matrix has 10 columns. So in the first iteration the last plotted column (the one you see) has color mod(10,7)==3 (yellow). In the second iteration you cycle through 10 more colors starting from 3, that is, you get color mod(3+10,7)==6 (light blue). And so on. Thus the color you see in the figure depends on the loop index ii, but not in the way you expected.

legend creates its entries by picking the color (and line spec) of each plotted line, in the order in which they were plotted. There are 10*6==60 plotted lines, each corresponding to a column of a matrix. But since you only supply six strings to legend, it just picks the first six of those lines, and uses their colors to create the legend entries. Those colors follow the default order, as explained above.

None of those first six lines that make it into the legend are actually seen in the figure, because they are covered by other lines. But legend doesn't care about that. So you get six legend entries with the default color order, which of course doesn't match the lines you actually see in the graph.

Solution

From the above, the solution is clear: replaced the referred line by

yvals = zeros(1, length(xvals)) + ii;

to create yvals as a vector (not a matrix). That way you'll get the figure you expected:



来源:https://stackoverflow.com/questions/32661902/matlab-legend-colors-dont-match-lines

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!