重置ColorOrder索引以在Matlab / Octave中绘图

时间:2015-05-12 06:48:26

标签: matlab plot octave

我的矩阵x1, x2, ...包含变量行向量。 我做了连续的情节

figure
hold all % or hold on
plot(x1')
plot(x2')
plot(x3')

Matlab或octave通常遍历ColorOrder并绘制不同颜色的每一行。 但我希望每个plot命令再次使用colororder中的第一种颜色,因此在默认情况下,矩阵中的第一个矢量应为蓝色,第二个为绿色,第三个为红色等。 / p>

不幸的是我找不到与颜色索引相关的任何属性,而是另一种重置它的方法。

5 个答案:

答案 0 :(得分:8)

您可以在当前轴上移动原始ColorOrder,以便新绘图从相同的颜色开始:

h=plot(x1');
set(gca, 'ColorOrder', circshift(get(gca, 'ColorOrder'), numel(h)))
plot(x2');

您可以将其包装在一个函数中:

function h=plotc(X, varargin)
h=plot(X, varargin{:});
set(gca, 'ColorOrder', circshift(get(gca, 'ColorOrder'), numel(h)));
if nargout==0,
    clear h
end
end

并致电

hold all
plotc(x1')
plotc(x2')
plotc(x3')

答案 1 :(得分:5)

从R2014b开始,有一种简单的方法可以重新启动颜色顺序。

每次需要重置颜色顺序时插入此行。

set(gca,'ColorOrderIndex',1)

ax = gca;
ax.ColorOrderIndex = 1;

请参阅: http://au.mathworks.com/help/matlab/graphics_transition/why-are-plot-lines-different-colors.html

答案 2 :(得分:2)

found a link一个人最终解决了这个问题。他使用这段代码:

t = linspace(0,1,lineCount)';
s = 1/2 + zeros(lineCount,1);
v = 0.8*ones(lineCount,1);
lineColors = colormap(squeeze(hsv2rgb(t,s,v)))
ax=gca
ax.ColorOrder = lineColors;

假设每个矩阵的行数相同,哪个适用于您。如果他们不这样做,那么我感觉你将不得不使用上面的lineColors分别循环和绘制每一行,以为'Color'的{​​{1}} linespec属性指定RBG三元组}。所以你可以使用这样的函数:

plot

其中function h = plot_colors(X, lineCount, varargin) %// For more control - move these four lines outside of the function and make replace lineCount as a parameter with lineColors t = linspace(0,1,lineCount)'; %//' s = 1/2 + zeros(lineCount,1); v = 0.8*ones(lineCount,1); lineColors = colormap(squeeze(hsv2rgb(t,s,v))); for row = 1:size(X,1) h = plot(X(row, :), 'Color', lineColors(row,:), varargin{:}); %// Assuming I've remembered how to use it correctly, varargin should mean you can still pass in all the normal plot parameters like line width and '-' etc hold on; end end lineCount矩阵中最大的行数

答案 3 :(得分:2)

在执行实际绘图之前,定义一个拦截对plot的调用并将'ColorOrderIndex'设置为1的函数。

function plot(varargin)
if strcmp(class(varargin{1}), 'matlab.graphics.axis.Axes')
    h = varargin{1}; %// axes are specified
else
    h = gca; %// axes are not specified: use current axes
end
set(h, 'ColorOrderIndex', 1) %// reset color index
builtin('plot', (varargin{:})) %// call builtin plot function

我在Matlab R2014b中对此进行了测试。

答案 4 :(得分:1)

如果你想要一个稍微有点hacky,最小的代码行方法,也许你可以在每个矩阵图的末尾绘制适当数量的(0,0)点,以便将你的colourorder推回到开头 - 这就像Mohsen Nosratinia的解决方案,但不太优雅...

假设有七种颜色可以在matlab中循环,你可以做类似的事情

Intent.parseUri(generatorOutput,URI_INTENT_SCHEME);