【问题标题】:How to give different colors when I loop for plot in MATLAB?当我在MATLAB中循环绘图时如何给出不同的颜色?
【发布时间】:2013-10-13 20:23:41
【问题描述】:

我有一些数据说 X 的大小为 (100,2)。这个 X 由 10 个类别(10 个一组)的数据组成。现在我想看看每个类别的数据中的模式。为此,我需要为每个类别分配不同的颜色。我试图循环而不是做 10 个不同的情节。我尝试了以下。

hold on
for i=1:10:100
   plot(X(i:i+9,1),X(i:i+9,2),'.')
end
hold off

这给了我一个相同颜色的情节。如何为不同的范围分配不同的颜色?

【问题讨论】:

    标签: matlab plot


    【解决方案1】:

    提到hold all 的答案是正确的,并且对于循环使用ColorOrder axes property 指定的颜色很有用(即使现在只是hold on 等同于hold all)。但是,默认情况下,MATLAB 只指定一个简短的颜色列表(从 R2013b 开始只有 7 个)以循环通过,另一方面,为更多数据系列找到一组好的颜色可能会有问题。对于 10 个图,您显然不能依赖默认的 ColorOrder,因此定义 N 种视觉上不同的颜色 的好方法是使用 "Generate Maximally Perceptually-Distinct Colors" (GMPDC) submission on the MATLAB Central File File Exchange。最好用作者自己的话来描述:

    此函数生成一组可通过参考“Lab”颜色空间进行区分的颜色,与 RGB 相比,它更接近人类的颜色感知。给定一个可能的颜色的初始大列表,它会迭代地选择列表中距离所有先前选择的条目最远(在实验室空间中)的条目。

    例如,以下是请求 25 时生成的颜色:

    GMPDC 提交在 MathWorks 的官方博客上被选为 Pick of the Week a few years ago,部分原因是能够请求任意数量的颜色(与 MATLAB 内置的 7 种默认颜色相反)。他们甚至提出了很好的建议,将 MATLAB 的 ColorOrder 在启动时设置为,

    distinguishable_colors(20)
    

    当然,您可以将ColorOrder 设置为单轴,或者简单地生成一个颜色列表,以您喜欢的任何方式使用。例如,要生成 10 个“最大感知不同的颜色”并将它们用于同一轴上的 10 个图(不使用ColorOrder):

    % Starting with X of size 100x2
    X = reshape(X,10,10,2); % for clarity, column is category, row is observation
    mpdc10 = distinguishable_colors(10) % 10x3 color list
    hold on
    for ii=1:10,
        plot(X(:,ii,1),X(:,ii,2),'.','Color',mpdc10(ii,:));
    end
    

    或者,使用ColorOrder 轴属性可以简化流程:

    X = reshape(X,10,10,2); % for clarity, and to avoid loop
    mpdc10 = distinguishable_colors(10) % 10x3 color map
    ha = axes; hold(ha,'on')
    set(ha,'ColorOrder',mpdc10)
    plot(X(:,:,1),X(:,:,2),'-.') % loop NOT needed, 'Color' NOT needed
    

    附录

    要获取用于当前轴的ColorOrder RGB 数组,

    get(gca,'ColorOrder')
    

    要获取新坐标区的默认 ColorOrder

    get(0,'DefaultAxesColorOrder')
    

    在 MATLAB 启动时使用 10 种颜色设置新的全局 ColorOrder 示例,在 startup.m 中:

    set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
    

    【讨论】:

    • ha = axes; hold(ha,'on') 在 Matlab 2016b 上效果不佳。当在一个图中绘制许多图时,它会产生断轴刻度。 ha = gca; 工作
    • @JonasStein axes 只是创建新轴,而gca 获取当前轴或如果没有打开轴则创建新轴。因此,如果它不再起作用,则值得向 MathWorks 报告。但是,我正在运行 R2016b 并且没有发现任何问题。你能发布一个要重现的要点吗?和/或截图?
    【解决方案2】:

    最简单的解决方案是将hold on 替换为hold all

    如果您想要更多控制权,您必须手动定义您的线路规格(更多信息here),然后将它们传递给plot

    linespec = {'b.', 'r-', 'g--o'}; % define your ten linespecs in a cell array
    hold on
    for i=1:10:100
       plot(X(i:i+9,1),X(i:i+9,2),linespec{i})
    end
    hold off
    

    【讨论】:

      【解决方案3】:

      hold on 确保新的plot 命令添加到绘图而不是替换它。但是,每个命令都好像在生成一个新图,包括从第一行颜色(蓝色)开始。如果您希望后续绘图使用不同的颜色,请改用hold all。这样就轮流使用标准的 7 种线条颜色了。

      由于您要绘制 10 条线,您可能需要明确指定颜色以确保它们都不同。为此,请使用语法

      plot(..., 'Color', [r g b])
      

      【讨论】:

      • 哦,太好了。再一次,The Mathworks 以其无限的智慧决定打破兼容性...... >:( 不知道他们是如何摆脱这种行为的。
      • 因为它们比任何选项都好。听说过 MatrixX 吗?没错。
      猜你喜欢
      • 2012-04-26
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 2011-10-10
      • 2013-11-27
      • 1970-01-01
      相关资源
      最近更新 更多