如何在MATLAB中循环绘制时为不同的图形赋予不同的颜色?

4

我有一些数据,名为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

这给了我一个相同颜色的图表。我如何为不同的范围分配不同的颜色?
3个回答

8
提到hold all的答案是正确和有用的,可以循环通过ColorOrder axes property 指定的颜色(尽管现在仅用hold on等同于hold all)。 但是,默认情况下,MATLAB仅指定一小组颜色(截至R2013b仅为7个),要循环显示更多数据系列时可能会遇到问题。对于10个图,您显然不能依赖默认的ColorOrder,因此一个很好的方法是使用“生成最大感知差异颜色”(GMPDC),它提供了N种视觉上不同的颜色。 这个函数是作者自己的话:

该函数生成一组颜色,这些颜色可以通过参考“Lab”颜色空间来区分,该颜色空间比RGB更接近人类的视觉感知。 给定一个初始的可能颜色列表,它迭代地选择在列表中距离所有先前选择的条目最远(在Lab空间中)的条目。

例如,当请求25种颜色时,生成的颜色如下所示:

25 "maximally perceptually-distinct colors"

数年前在MathWorks官方博客上选择了GMPDC提交作为每周精选,部分原因是可以请求任意数量的颜色(与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 启动时,在 startup.m 中设置新的全局 ColorOrder,包含 10 种颜色的示例:

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

在Matlab 2016b上,ha = axes; hold(ha,'on')的效果不佳。当在一个图中绘制多个图时,它会产生损坏的轴刻度。使用ha = gca;则可以解决这个问题。 - Jonas Stein
@JonasStein axes 只是创建新的坐标轴,而 gca 获取当前的坐标轴或者在没有打开的情况下创建新的坐标轴。所以如果它不再起作用了,那么值得向 MathWorks 报告。然而,我正在运行 R2016b,我没有观察到任何问题。你能否发布一个 gist 来重现问题?和/或者一张截图? - chappjc

4
最简单的解决方案是将hold on替换为hold all
如果你想要更多的控制,你需要手动定义你的线条规格(更多信息请参见这里),然后将它们传递给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

1

hold on 保证新的 plot 命令添加到绘图中而不是替换它。然而,每个命令都像生成一个新的图一样工作,包括从第一条线颜色 (蓝色) 开始。如果您想要后续绘图使用不同的颜色,请改用 hold all。这样标准的7种线条颜色就会依次使用。

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

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

哦,太好了。Mathworks在他们的无限智慧中再次决定破坏兼容性... >:( 不知道他们如何逃脱这种行为的惩罚。 - A. Donda
因为它们比任何选项都更好。你听说过MatrixX吗?确切地说。 - Marc

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