题
我试图在同一张图上绘制几个核密度估计,并且我希望它们都是不同的颜色。我有一个使用字符串的拼凑解决方案 'rgbcmyk'
并为每个单独的图逐步执行它,但在 7 次迭代后我开始出现重复。有没有更简单/更有效的方法来做到这一点,并且有更多的颜色选项?
for n=1:10
source(n).data=normrnd(rand()*100,abs(rand()*50),100,1); %generate random data
end
cstring='rgbcmyk'; % color string
figure
hold on
for n=1:length(source)
[f,x]=ksdensity(source(n).data); % calculate the distribution
plot(x,f,cstring(mod(n,7)+1)) % plot with a different color each time
end
解决方案
您可以使用色彩映射表如HSV以产生一组颜色。例如:
cc=hsv(12);
figure;
hold on;
for i=1:12
plot([0 1],[0 i],'color',cc(i,:));
end
MATLAB有13周不同的命名的colormaps( 'doc的颜色映射'列出他们全部)。
有不同颜色的绘制线另一种选择是使用 LineStyleOrder 属性;看到定义线条的颜色为MATLAB文档中绘制为更多的信息。
其他提示
实际上,用于获取颜色周期体面快捷方法是代替hold all;
的使用hold on;
。每个连续plot
将通过MATLAB的默认颜色映射旋转(自动为您)。
这在MATLAB现场 hold
:
hold all
持有的情节,以及电流线颜色和线型,以使后续绘图命令不重置ColorOrder和LineStyleOrder属性值到列表的开头。绘图命令继续通过从最后情节列表中停止的地方的预定义颜色和linestyles循环。
迟到的答案,但有两件事需要补充:
- 有关如何更改的信息
'ColorOrder'
属性以及如何设置全局默认值'DefaultAxesColorOrder'
, ,请参阅本文底部的“附录”。 - MATLAB Central File Exchange 上有一个很棒的工具,可以生成任意数量的视觉上不同的颜色(如果您有图像处理工具箱可以使用它)。请继续阅读以了解详细信息。
这 ColorOrder
axes
财产 允许 MATLAB 在使用时自动循环显示颜色列表 hold on/all
(再次,请参阅下面的附录了解如何 set
/get
这 ColorOrder
对于特定轴或全局通过 DefaultAxesColorOrder
)。但是,默认情况下 MATLAB 仅指定一个简短的颜色列表(只有 7 自 R2013b) 循环遍历,另一方面,为更多数据系列找到一组好的颜色可能会出现问题。对于 10 个图,您显然不能依赖默认值 ColorOrder
.
一个很好的方法 定义 N 种视觉上不同的颜色 是与 在 MATLAB Central File Exchange 上提交“生成最大感知不同颜色”(GMPDC). 。用作者自己的话说是最好的描述:
该函数生成一组颜色,可通过参考来区分 “实验室”色彩空间, ,比 RGB 更符合人类的色彩感知。给定一个可能颜色的初始大列表,它会迭代地选择列表中距所有先前选择的条目最远(在实验室空间中)的条目。
例如,当请求 25 种颜色时:
GMPDC 提交被 MathWorks 官方博客选为 本周精选 2010 年,部分原因是能够请求任意数量的颜色(与 MATLAB 内置的 7 种默认颜色相反)。他们甚至提出了设置 MATLAB 的极好建议 ColorOrder
启动时,
distinguishable_colors(20)
当然,你可以设置 ColorOrder
对于单个轴或只是生成一个颜色列表以按照您喜欢的任何方式使用。例如,生成 10 种“最大感知上不同的颜色”并将它们用于同一轴上的 10 个绘图(但不使用 ColorOrder
, ,因此需要一个循环):
% Starting with X of size N-by-P-by-2, where P is number of plots
mpdc10 = distinguishable_colors(10) % 10x3 color list
hold on
for ii=1:size(X,2),
plot(X(:,ii,1),X(:,ii,2),'.','Color',mpdc10(ii,:));
end
流程简化了, 要求不 for
循环,与 ColorOrder
轴属性:
% X of size N-by-P-by-2 mpdc10 = distinguishable_colors(10) ha = axes; hold(ha,'on') set(ha,'ColorOrder',mpdc10) % --- 在此处设置颜色顺序 --- plot(X(:,:,1),X(:,:,2),'-.') % 不需要循环,不需要“颜色”。耶!
附录
为了得到 ColorOrder
用于当前轴的 RGB 数组,
get(gca,'ColorOrder')
获取默认值 ColorOrder
对于新轴,
get(0,'DefaultAxesColorOrder')
设置新全局的示例 ColorOrder
MATLAB 开始时有 10 种颜色,在 startup.m
:
set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
迟到了。我一直在寻找这个自己,才发现这个轴选项叫做ColorOrder 可以为会话或只是该图中指定的颜色顺序,然后只绘制的阵列,并让MATLAB通过颜色自动周期指定。
例如
set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
如果所有矢量具有相同大小,创建一个矩阵和绘制。
每列被绘制用不同的颜色自动地
然后你可以使用legend
指示列:
data = randn(100, 5);
figure;
plot(data);
legend(cellstr(num2str((1:size(data,2))')))
或者,如果你有内核名称的单元格,使用
legend(names)