Matlab传奇颜色与线条不匹配

时间:2015-09-18 22:23:34

标签: matlab graph plot matlab-figure

不确定这里出了什么问题。我在下面创建了一个最小的例子:

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

我系统的结果是:

Wrong plot colors

如果线条较少,它甚至可以在图例中添加颜色甚至不在图上。发生了什么事??

1 个答案:

答案 0 :(得分:3)

正在发生的事情的说明

问题出在

  

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

这会创建一个10x10平方矩阵,而不是1x10向量。然后plot将该矩阵的每个xvals对比。这会导致颜色混合,这可能不是你想要的。

分析具体发生的事情很有意思。 Matlab使用default cycle of colors绘制具有不同颜色的矩阵的每一列,在Matlab R2014b之后是

enter image description here

但是该矩阵的所有列都是相同的,因此每个列覆盖(覆盖)前一个列,并且您只能看到最后颜色。

现在,色彩循环有7种颜色,矩阵有10列。因此,在第一次迭代中,最后一个绘制的列(您看到的那个)具有颜色mod(10,7)==3(黄色)。在第二次迭代中,您将从3开始再循环10种颜色,即获得颜色mod(3+10,7)==6(浅蓝色)。等等。因此,您在图中看到的颜色取决于循环索引ii,但不是您预期的方式。

legend通过选择每条绘制线的颜色(和线条规格)按照绘制顺序创建条目。有10*6==60个绘制的线,每个线对应一个矩阵的列。但是因为你只向legend提供了六个字符串,所以它只选择那些行的前六个,并使用它们的颜色来创建图例条目。这些颜色遵循默认顺序,如上所述。

图中实际显示的是前六行中没有任何一行,因为它们被其他线覆盖。但legend并不关心这一点。因此,您将获得具有默认颜色顺序的六个图例条目,这当然与您在图表中实际看到的线条不匹配。

解决方案

从上面可以看出,解决方案很明确:用

代替了引用的行
yvals = zeros(1, length(xvals)) + ii;

yvals创建为向量(不是矩阵)。这样你就可以得到你想要的数字:

enter image description here