自动绘制不同的彩色线条

我试图在同一个图上绘制几个内核密度估计,我希望它们都是不同的颜色。 我有一个使用string'rgbcmyk'并逐步通过它每个单独的阴谋kludged解决scheme,但我开始有7个迭代后重复。 有没有更容易/更有效的方法来做到这一点,并有更多的颜色select?

 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个不同的命名颜色映射( “doc颜色映射”列出他们全部)。

用不同颜色绘制线条的另一个选项是使用LineStyleOrder属性; 请参阅在MATLAB文档中定义绘图线的颜色以获取更多信息。

实际上,让颜色循环的一个体面的捷径方法是使用hold all; 代替hold on; 。 每个连续的plot将通过MATLAB的默认颜色映射进行旋转(自动为您)。

从MATLAB网站上hold

hold all的graphics和当前的线条颜色和线条样式,以便后面的绘图命令不会将ColorOrder和LineStyleOrder属性值重置到列表的开头。 绘图命令继续循环通过列表中最后一个绘图停止的预定义颜色和线型。

迟到的答案,但要添加两件事情:

  • 有关如何更改'ColorOrder'属性以及如何使用'DefaultAxesColorOrder'设置全局默认值'DefaultAxesColorOrder' ,请参阅本文底部的“附录”。
  • 如果你有image processing工具箱来使用它,那么在MATLAB Central File Exchange上有一个很棒的工具可以生成任意数量的视觉上不同的颜色。 请阅读详细信息。

ColorOrder axes属性允许MATLAB在使用hold on/all时自动循环显示颜色列表(同样,请参阅下面的附录以了解如何set / get特定轴的ColorOrder或通过DefaultAxesColorOrder全局)。 但是,默认情况下, MATLAB只能指定一个简短的颜色列表(R2013b 只有7个来循环,另一方面,为更多的数据序列find一组好的颜色可能会有问题。 对于10个地块,显然不能依靠默认的ColorOrder

定义N种视觉上不同颜色的好方法是在MATLAB中央文件文件交换中提交“生成最大感知色差”(GMPDC)提交 。 最好用作者自己的话来描述:

这个函数产生一组可以通过参考“Lab”颜色空间来区分的颜色 ,它比RGB更接近人类的颜色感知。 给定一个可能的颜色的最初的大列表,它迭代地从所有先前select的条目中select最远(在Lab空间中)的条目。

例如,当请求25种颜色时:

25“最大感知不同的颜色”

GMPDC提交的作品在MathWorks的官方博客上被选为2010年度Pick of the Week ,部分原因是能够请求任意数量的颜色(与MATLAB内置的7种默认颜色形成鲜明对比)。 他们甚至提出了在开始设置MATLAB的ColorOrder的优秀build议,

 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的大小N乘P-2
 mpdc10 = distinishable_colors(10)
 ha =坐标轴; 持有(哈哈,“上”)
设置(ha,'ColorOrder',mpdc10)%--- 设置ColorOrder HERE ---
 plot(X(:,:,1),X(:,:2),' - 。')% 循环不需要,'Color'不需要。  好极了!

附录

要获取用于当前轴的ColorOrder RGB数组,

 get(gca,'ColorOrder') 

要获取新轴的默认ColorOrder

 get(0,'DefaultAxesColorOrder') 

startup.m启动MATLAB时,使用10种颜色设置新的全局ColorOrder示例:

 set(0,'DefaultAxesColorOrder',distinguishable_colors(10)) 

晚会到了晚会 我正在研究这个问题,只是发现了一个名为ColorOrder的轴选项,你可以指定会话的颜色顺序,或者只是指定graphics,然后绘制一个数组,让MATLAB自动循环指定的颜色。

请参阅更改默认的ColorOrder

 set(0,'DefaultAxesColorOrder',jet(5)) A=rand(10,5); plot(A); 

如果所有vector大小相同,则创build一个matrix并绘制它。 每列都自动绘制一个不同的颜色然后你可以使用legend来指示列:

 data = randn(100, 5); figure; plot(data); legend(cellstr(num2str((1:size(data,2))'))) 

或者,如果你有一个内核名称的单元,使用

 legend(names)