我正在尝试在同一图表上绘制几个核密度估计,我希望它们都是不同的颜色。我有一个使用字符串'rgbcmyk'
的kludged解决方案,并为每个单独的绘图单步执行,但我在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
答案 0 :(得分:129)
您可以使用HSV等色彩图来生成一组颜色。例如:
cc=hsv(12);
figure;
hold on;
for i=1:12
plot([0 1],[0 i],'color',cc(i,:));
end
MATLAB有13种不同的命名颜色图('doc colormap'全部列出它们)。
绘制不同颜色的线条的另一个选择是使用 LineStyleOrder 属性;有关详细信息,请参阅MATLAB文档中的Defining the Color of Lines for Plotting。
答案 1 :(得分:105)
实际上,让颜色循环的一个合适的快捷方法是使用hold all;
代替hold on;
。每个连续的plot
将通过MATLAB的默认色图旋转(自动为您)。
来自hold
上的MATLAB网站:
hold all
保存绘图和当前线条颜色和线条样式,以便后续绘图命令不会将ColorOrder和LineStyleOrder属性值重置为列表的开头。绘图命令继续循环通过预定义的颜色和线条样式,最后一个绘图在列表中停止。
答案 2 :(得分:32)
迟到的答案,但要添加两件事:
'ColorOrder'
属性以及如何使用'DefaultAxesColorOrder'
设置全局默认值的信息,请参阅本文底部的“附录”。 ColorOrder
axes
property允许MATLAB在使用hold on/all
时自动循环显示颜色列表(再次参见下面的附录,了解如何set
/ get
{{1}对于特定轴或通过ColorOrder
全局)。但是,默认情况下, MATLAB仅指定一个简短的颜色列表( 7 ,从R2013b开始)循环,另一方面,找到一个好的东西可能会有问题更多数据系列的颜色集。对于10个图,您显然不能依赖默认的DefaultAxesColorOrder
。
使用"Generate Maximally Perceptually-Distinct Colors" (GMPDC) submission on the MATLAB Central File File Exchange 定义N个视觉上鲜明的颜色的好方法。最好用作者自己的话来描述:
此函数生成一组颜色,这些颜色可通过参考"Lab" color space进行区分,Pick of the Week与RGB的颜色感知更接近。给定一个可能颜色的初始大列表,它迭代地选择列表中距离所有先前选择的条目最远(在实验室空间中)的条目。
例如,当要求25种颜色时:
GMPDC提交在2010年被MathWorks官方博客选为{{3}},部分原因是能够请求任意数量的颜色(与MATLAB内置的7种默认颜色形成对比)。他们甚至提出了在启动时将MATLAB的ColorOrder
设置为
ColorOrder
当然,您可以为单个轴设置distinguishable_colors(20)
,或者只是生成一个颜色列表,以您喜欢的任何方式使用。例如,要生成10“最大感知上不同的颜色”并在同一轴上使用它们10个图(但不使用ColorOrder
,因此需要循环):
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
轴属性:
% X of size N-by-P-by-2 mpdc10 = distinguishable_colors(10) ha = axes; hold(ha,'on') set(ha,'ColorOrder',mpdc10) % --- set ColorOrder HERE --- plot(X(:,:,1),X(:,:,2),'-.') % loop NOT needed, 'Color' NOT needed. Yay!
<强>附录强>
获取用于当前轴的ColorOrder
RGB数组
ColorOrder
获取新轴的默认get(gca,'ColorOrder')
,
ColorOrder
在get(0,'DefaultAxesColorOrder')
中在MATLAB start上设置10种颜色的新全局ColorOrder
示例:
startup.m
答案 3 :(得分:11)
晚会。我自己正在研究这个问题,刚刚找到了名为ColorOrder的这个轴选项 您可以指定会话的颜色顺序或仅为图形指定,然后只绘制一个数组,让MATLAB自动循环显示指定的颜色。
请参阅Changing the Default ColorOrder
例如
set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
答案 4 :(得分:3)
如果所有矢量具有相同的大小,则创建一个矩阵并绘制它。
每列用自动绘制不同的颜色
然后,您可以使用legend
来表示列:
data = randn(100, 5);
figure;
plot(data);
legend(cellstr(num2str((1:size(data,2))')))
或者,如果您有一个包含内核名称的单元格,请使用
legend(names)