告诉MATLAB不要更新特定绘图的下一个默认颜色。

7
假设有以下情况:
hold on 
plot(rand(1,20));
plot(rand(1,10));
plot(rand(1,20));

MATLAB将绘制3条线,每条线都有默认的颜色(例如红色、蓝色、黄色)。

现在,由于第二个图形较短,我想执行以下操作:

hold on 
plot(rand(1,20));
pl=plot(rand(1,10));
plot(11:20,rand(1,10),'color',get(pl,'color') ...
  ,'LineStyle','--'); 
plot(rand(1,20)); 

然而,尽管第三张图确实具有第二张图的颜色,但第四张图具有第四个默认颜色,而不是第三个。似乎无论是否使用它,MATLAB都会更新下一个默认颜色顺序的索引。
虽然我知道可以使用get(groot,'DefaultAxesColorOrder')获取所有默认颜色,然后将每个图的属性设置为我想要的索引,但我想知道是否有一种告诉MATLAB "嘿,在下一个图中,请不要更新该默认颜色索引"的方法。
3个回答

4
一种不依赖于任何未记录的功能的解决方案是使用较原始的line函数来生成一些图形,而不是使用更高级别的plot函数。如果您使用line绘制第三条线,则应该得到所需的结果,因为它不会增加由plot使用的颜色顺序索引。
hold on;
plot(rand(1, 20));
hp = plot(rand(1, 10)+1);
line(11:20, rand(1, 10)+1, 'Color', get(hp, 'Color'), 'LineStyle', '--');
plot(rand(1, 20)+2);

enter image description here


2

当您在坐标轴上绘制图形时,会使用一个未记录的axes变量来控制使用颜色顺序中的哪个值。我没有深入研究过它们,所以您需要更深入地了解它们的工作方式 - 但本质上它们是:

ax = axes();
ax.ColorOrderIndex_I
ax.ColorOrderMode

更新您的示例(和数据稍微调整一下 - 因为我发现这样更容易查看) - 在绘制“两条线作为一个”之后,您可以从ColorOrderIndex_I中减去一个:

v1 = ones(20,1);
v2 = v1(1:10)+1;
v3 = v1+2;
figure;

ax = subplot ( 2, 1, 1 )
hold on 
plot(v1);
plot(v2);
plot(v3);
ax = subplot ( 2, 1, 2 );
hold on 
plot(v1);
pl=plot(v2);
plot(11:20,v2,'color',get(pl,'color')   ,'LineStyle','--'); 
ax.ColorOrderIndex_I = ax.ColorOrderIndex_I-1;
plot(v3); 

上述脚本的输出如下所示

注意:使用了未记录的功能-已测试r2015b。


非常准确!适用于2014b版本。 - Ander Biguri
4
为什么不使用记录在案的属性ColorOrderIndex?在绘图之前,只需执行 set(gca, 'ColorOrderIndex', get(gca, 'ColorOrderIndex')-1) 即可。或者最好执行 set(gca, 'ColorOrderIndex', mod(get(gca, 'ColorOrderIndex')-2, size(get(gca, 'ColorOrder'),1))+1) 来循环使用。@AnderBiguri - Luis Mendo
@LuisMendo 为什么不呢... :) 有时候答案就在你面前... - matlabgui

2

LuisMendo的评论很有效,所以我将其放入了一个函数中:

Original Answer翻译成"最初的回答"

function undoColorOrderUpdate(axis, steps)
    if ~exist('axis', 'var')
        axis = gca;
    end
    if ~exist('steps', 'var')
        steps = 1;
    end

    oldindex = get(axis, 'ColorOrderIndex');
    numcolors = size(get(axis, 'ColorOrder'),1);
    newindex = mod(oldindex-1-steps, numcolors)+1;
    set(axis, 'ColorOrderIndex', newindex);
end

您可以在要忽略的绘图之前或之后加上undoColorOrderUpdate();undoColorOrderUpdate(gca, 1);。如果您将其放在之前,您不需要再使用句柄或手动设置颜色:
hold on;
plot(rand(1,20));
plot(rand(1,10));
undoColorOrderUpdate();
plot(11:20,rand(1,10),'LineStyle','--');
plot(rand(1,20));

1
不错!有两个小注释:1 如果没有参数调用函数,您不需要使用 ()(虽然我猜看到您调用函数很好)。例如,gca 是一个函数,您也不需要写成 gca()2 ~exist('axis', 'var') 可以更有效地写成 nargin<1 - Cris Luengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接