答案提到hold all
对于循环指定的颜色是正确且有用的ColorOrder axes财产 http://www.mathworks.com/help/matlab/ref/axes_props.html#ColorOrder(尽管只是hold on
现在相当于hold all
)。然而,默认情况下,MATLAB 仅指定要循环的简短颜色列表(从 R2013b 开始只有 7 种),另一方面,为更多数据系列找到一组好的颜色可能会出现问题。对于 10 个图,您显然不能依赖默认值ColorOrder
,这是一个很好的方法定义 N 种视觉上不同的颜色是与在 MATLAB Central File Exchange 上提交“生成最大感知不同颜色”(GMPDC) http://www.mathworks.com/matlabcentral/fileexchange/29702-generate-maximally-perceptually-distinct-colors。用作者自己的话说是最好的描述:
此函数生成一组可通过参考“Lab”颜色空间进行区分的颜色,该颜色空间比 RGB 更接近人类颜色感知。给定一个可能颜色的初始大列表,它会迭代地选择列表中距所有先前选择的条目最远(在实验室空间中)的条目。
例如,以下是请求 25 时生成的颜色:
GMPDC 提交被 MathWorks 官方博客选为几年前的本周精选 http://blogs.mathworks.com/pick/2010/12/23/generate-distinct-colors-for-your-matlab-plots/部分原因是因为能够请求任意数量的颜色(与 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
axis 属性简化了这个过程:
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
APPENDIX
为了得到ColorOrder
用于当前轴的 RGB 数组,
get(gca,'ColorOrder')
获取默认值ColorOrder
对于新轴,
get(0,'DefaultAxesColorOrder')
设置新全局的示例ColorOrder
MATLAB 开始时有 10 种颜色,在startup.m
:
set(0,'DefaultAxesColorOrder',distinguishable_colors(10))