自动绘制不同颜色的线条

时间:2010-01-08 16:01:49

标签: matlab plot matlab-figure

我正在尝试在同一图表上绘制几个核密度估计,我希望它们都是不同的颜色。我有一个使用字符串'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

5 个答案:

答案 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'设置全局默认值的信息,请参阅本文底部的“附录”。
  • 如果您有图像处理工具箱使用它,MATLAB Central File Exchange上有一个很棒的工具可以生成任意数量的视觉上不同的颜色。请继续阅读。

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种颜色时:

25 "maximally perceptually-distinct colors"

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)