113

我试图在同一张图上绘制几个内核密度估计,我希望它们都是不同的颜色。我有一个使用字符串的 kludged 解决方案'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
4

5 回答 5

132

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

于 2010-01-08T16:13:03.183 回答
107

实际上,让颜色循环的一个不错的快捷方法是使用hold all;. hold on;每个连续plot的都将通过 MATLAB 的默认颜色图(自动为您旋转)。

从 MATLAB 网站hold

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

于 2010-01-09T01:50:32.347 回答
37

迟到的答案,但要补充两点:

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

ColorOrder axes属性允许 MATLAB 在使用时自动循环显示颜色列表(再次,请参阅下面的hold on/all附录,了解如何set/用于特定轴或全局通过)。但是,默认情况下,MATLAB 只指定一个简短的颜色列表(从 R2013b 开始只有 7个)以循环通过,另一方面,为更多数据系列找到一组好的颜色可能会出现问题。对于 10 个图,您显然不能依赖默认的.getColorOrderDefaultAxesColorOrderColorOrder

定义 N 种视觉上不同颜色的好方法是使用MATLAB Central File File Exchange 上的“Generate Maximally Perceptually-Distinct Colors”(GMPDC)提交。最好用作者自己的话来描述:

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

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

25

GMPDC 提交在 MathWorks 的官方博客上被选为2010 年的每周精选,部分原因是能够请求任意数量的颜色(与 MATLAB 内置的 7 种默认颜色相反)。他们甚至提出了将 MATLABColorOrder在启动时设置为的极好建议,

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 = 可区分颜色(10)
ha = 轴;保持(哈,'开')
set(ha,'ColorOrder',mpdc10) % ---在这里设置 ColorOrder ---
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))
于 2014-02-26T00:43:05.107 回答
13

晚会迟到了。我自己正在研究这个,只是发现了这个名为 ColorOrder 的轴选项,您可以指定会话的颜色顺序或仅为图形指定颜色顺序,然后只需绘制一个数组并让 MATLAB 自动循环指定颜色。

请参阅更改默认颜色顺序

例子

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
于 2012-06-12T18:36:37.203 回答
5

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

data = randn(100, 5);

figure;
plot(data);

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

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

legend(names)
于 2010-01-11T19:36:13.403 回答