【问题标题】:Reset ColorOrder index for plotting in Matlab / Octave重置用于在 Matlab / Octave 中绘图的 ColorOrder 索引
【发布时间】:2015-07-22 21:41:23
【问题描述】:

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

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

Matlab 或 octave 通常会遍历 ColorOrder 并以不同的颜色绘制每条线。 但我希望每个 plot 命令以颜色顺序中的第一种颜色重新开始,因此在默认情况下,矩阵中的第一个向量应该是蓝色,第二个是绿色,第三个是红色等。

很遗憾,我找不到任何与颜色索引相关的属性,也找不到其他方法来重置它。

【问题讨论】:

  • 所有x 矩阵都绘制相同数量的行吗?
  • 您使用哪个版本的 Matlab ?如果您使用 2014b 之前的版本,您可以简单地使用 hold on 而不是 hold all ...然后所有 plot 命令将从颜色顺序的开头开始。
  • 实际上我使用 Octave,因为我不再拥有 Matlab 许可证。 @Dan我可以想象设置适当长度的颜色图,但不幸的是行数会有所不同。这就是我提出问题的原因。
  • @Honza 那么你可能不得不循环。我将在下面编辑我的答案,为您创建一个函数...
  • 循环并不优雅,但它似乎是唯一的方法,不幸的是......

标签: matlab plot octave


【解决方案1】:

从 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

【讨论】:

  • 此答案在 Octave 中不起作用,因为 ColorOrderIndex 属性未在 octave 中使用。
【解决方案2】:

如果您想要一种稍微老套、代码行数最少的方法,也许您可​​以在每个矩阵图的末尾绘制适当数量的 (0,0) 点,以将您的颜色顺序推回到开头 - 这就像 Mohsen Nosratinia 的解决方案,但不太优雅......

假设有七种颜色可以像在 matlab 中那样循环,你可以做这样的事情

% number of colours in ColorOrder
nco = 7;
% plot matrix 1
plot(x1');
% work out how many empty plots are needed and plot them
nep = nco - mod(size(x1,1), nco); plot(zeros(nep,nep));
% plot matrix 2
plot(x2');
...
% cover up the coloured dots with a black one at the end
plot(0,0,'k');

【讨论】:

    【解决方案3】:

    在进行实际绘图之前,定义一个函数来拦截对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 中对此进行了测试。

    【讨论】:

    • 不错的解决方案。我相信它可以在当前的 Matlab 中工作,但不幸的是 Octave 不知道 'ColorOrderIndex' 属性。
    • 哦。可惜 :-) 我无法使用 Octave
    • Octave v5.1.0 确实有ColorOrderIndex
    【解决方案4】:

    您可以在当前坐标区中移动原来的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')
    

    【讨论】:

    • 这似乎不再适用于 MATLAB 2020a。 Luis Mendo 使用set(h,'ColorOrderIndex', 1) 的答案似乎有效。
    【解决方案5】:

    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 分别循环和绘制每一行,以便为plot'Color' linespec 属性指定一个 RBG 三元组。所以你也许可以使用这样的函数:

    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
    

    其中lineCountx 矩阵中的最大行数

    【讨论】:

      猜你喜欢
      • 2017-09-21
      • 2013-05-10
      • 2017-03-31
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2012-11-24
      • 1970-01-01
      相关资源
      最近更新 更多