我有一些数据说 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
这给了我一个相同颜色的情节。如何为不同的范围分配不同的颜色?
提到的答案hold all
是正确的并且对于循环通过ColorOrder
axes
属性指定的颜色有用(即使hold on
现在等同于hold all
)。但是,默认情况下,MATLAB 只指定一个简短的颜色列表(从 R2013b 开始只有 7 个)以循环通过,另一方面,为更多数据系列找到一组好的颜色可能会有问题。对于 10 个绘图,您显然不能依赖默认值ColorOrder
,因此定义 N 种视觉上不同颜色的好方法是使用MATLAB Central File Exchange 上的“Generate Maximally Perceptually-Distinct Colors”(GMPDC)提交。最好用作者自己的话来描述:
此函数生成一组颜色,这些颜色可通过参考“Lab”颜色空间进行区分,与 RGB 相比,它更接近人类的颜色感知。给定一个可能颜色的初始大列表,它迭代地选择列表中与所有先前选择的条目最远(在实验室空间中)的条目。
例如,以下是请求 25 时生成的颜色:
几年前, GMPDC 提交在 MathWorks 的官方博客上被选为每周精选,部分原因是能够请求任意数量的颜色(与 MATLAB 内置的 7 种默认颜色相反)。他们甚至提出了将 MATLABColorOrder
在启动时设置为的极好建议,
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')
ColorOrder
在 MATLAB 开始时使用 10 种颜色设置新全局的示例,在startup.m
:
set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
最简单的解决方案是替换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
hold on
确保新plot
命令添加到绘图而不是替换它。但是,每个命令都好像在生成一个新图,包括从第一行颜色(蓝色)开始。如果您希望后续绘图使用不同的颜色,请hold all
改用。这样,依次使用标准的 7 种线条颜色。
由于要绘制 10 条线,因此您可能需要明确指定颜色以确保它们都不同。为此,请使用语法
plot(..., 'Color', [r g b])