自动绘制不同的彩色线


112

我正在尝试在同一张图上绘制几个内核密度估计值,并且希望它们全部为不同的颜色。我有一个使用字符串的混乱解决方案,'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

30
您是否尝试过简单地“全部保留”?这会为每个新的绘图命令自动绘制新闻颜色。
twerdster 2011年

3
“全部保留”并不是对实际问题的解答,但对于许多到此为止的人来说可能是一个解决方案,因为仅“保留”就将所有曲线绘制为蓝色。非常感谢@twerdster!
雷米

8
R2014b开始,通常hold on功能上等效hold all。但是,如何获得超过7种默认颜色的问题仍然存在。如下所示,默认颜色图可以是Azim描述的解决方案,也可以使用生成为便于视觉识别而调整的颜色的功能。
2014年

1
当我使用时hold all,会得到不同颜色的图(即使我必须说它们看起来很暗淡),而当我使用时,我的hold on所有图都会变成蓝色。所以我想知道什么是功能对等。
HelloGoodbye 2015年

4
@HelloGoodbye在R2014b和更高版本中,hold on给出不同的颜色图。您使用的是旧版本。从当前文档中,“ hold allhold on。相同。注意: 此语法将在以后的版本中删除。hold on改为使用。” 另请参见发行说明
chappjc 2015年

Answers:


131

您可以使用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文档中的定义线条颜色


在寻找它。@Azim好。
教授

为了后代的缘故,我选择@Mark Elliot hold all解决方案接受此答案,因为它具有选择不同颜色表的多功能性。
Doresoom

如何使用“线”图命令而不是图使其工作?
Pedro77 '16

106

实际上,对于得到的颜色周期像样的快捷方法是使用hold all;代替hold on;。每一个连续的图像plot将通过MATLAB的默认颜色图(自动为您旋转)旋转。

在MATLAB网站上hold

hold all保留绘图以及当前的线条颜色和线条样式,以便后续的绘图命令不会将ColorOrder和LineStyleOrder属性值重置为列表的开头。绘图命令将继续循环使用预定义的颜色和线型,从列表中最后一个绘图停止处开始。


36

答案较晚,但要补充两点:

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

ColorOrder axes属性允许MATLAB来自动循环的颜色的列表使用时hold on/all(同样,请参阅下面如何附录set/ get所述ColorOrder特定轴线或全局通过DefaultAxesColorOrder)。但是,默认情况下,MATLAB仅指定要循环显示的一小段颜色(从R2013b开始只有7种),另一方面,为更多数据系列找到一组好的颜色可能会成问题。对于10个地块,您显然不能依靠default ColorOrder

定义N种视觉上不同的颜色的一种好方法是在MATLAB Central File File Exchange上提交“生成最大感知上不同的颜色”(GMPDC)。最好用作者自己的话来形容:

此函数生成一组颜色,这些颜色可以通过参考“实验室”颜色空间来区分,该颜色空间比RGB与人的颜色感知更接近。给定一个可能的颜色的初始大列表,迭代地选择列表中距离所有先前选择的条目最远(在Lab空间中)的条目。

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

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

使用axis属性简化了过程,不需要for循环ColorOrder

尺寸X乘P乘X的%X
mpdc10 =杰出的色彩(10)
ha =轴;保持(ha,'on')
set(ha,'ColorOrder',mpdc10)%--- 在此处设置ColorOrder ---
plot(X(:,:,1),X(:,:,2),'-。')%不需要循环,不需要'Color'。好极了!

附录

要获取ColorOrder用于当前轴的RGB阵列,

get(gca,'ColorOrder')

要获取ColorOrder新轴的默认值,

get(0,'DefaultAxesColorOrder')

ColorOrder在MATLAB开始时使用10种颜色设置新的global的示例,在startup.m

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

2
仅需注意,这似乎需要“图像处理工具箱”。
Doresoom

2
@Doresoom感谢您提供信息。我更新了帖子。
chappjc 2015年

12

晚会。我本人对此进行了调查,然后发现了一个名为ColorOrder的轴选项,您可以为会话指定颜色顺序,也可以为图形指定颜色顺序,然后绘制数组并让MATLAB自动循环显示指定的颜色。

请参阅更改默认的ColorOrder

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

1
对于一次性轴:set(gca,'ColorOrder',jet(5));
Evgeni Sergeev 2013年

1
仅用于通知jet(number)(不需要任何精美的工具箱)就非常出色
crobar 2015年

4

如果所有向量的大小相等,则创建一个矩阵并将其绘制。自动以不同的颜色绘制每列,然后您可以legend用来指示各列:

data = randn(100, 5);

figure;
plot(data);

legend(cellstr(num2str((1:size(data,2))')))

或者,如果您的单元格具有内核名称,请使用

legend(names)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.