提到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))