Automatically plot different colored lines

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

你可以使用一个像 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 的默认颜色图旋转(自动为您)。

From the MATLAB site on hold:

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

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

data = randn(100, 5);


figure;
plot(data);


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

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

legend(names)

Late to the party. I was looking into this myself and just found about this axes option called ColorOrder 你可以为会话指定颜色顺序,或者只是为图形指定颜色顺序,然后绘制一个数组,让 MATLAB 自动循环显示指定的颜色。

Changing the Default ColorOrder

例子

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

回答晚了,但有两点要补充:

  • 有关如何更改 'ColorOrder'属性以及如何使用 'DefaultAxesColorOrder'设置全局默认值的信息,请参阅本文底部的“附录”。
  • 有一个伟大的工具在 MATLAB 中央文件交换生成任何数量的视觉明显的颜色,如果你有图像处理工具箱使用它。细节请继续阅读。

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

通向 在视觉上明显的颜色的一个好方法就是使用 在 MATLAB 中央文件交换中提交“生成最大感知不同颜色”(GMPDC)。用作者自己的话来说就是:

This function generates a set of colors which are distinguishable by reference to the “实验室”色彩空间, which more closely matches human color perception than RGB. Given an initial large list of possible colors, it iteratively chooses the entry in the list that is farthest (in Lab space) from all previously-chosen entries.

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

25 "maximally perceptually-distinct colors"

GMPDC 提交在2010年被 MathWorks 的官方博客选为 本周精选,部分原因是因为它可以请求任意数量的颜色(与 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

The process is simplified, 不需要 ABC0循环,具有 ColorOrder轴属性:

% 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 数组,

get(gca,'ColorOrder')

To get the default ColorOrder for new axes,

get(0,'DefaultAxesColorOrder')

设置新的全局 ColorOrder与10种颜色在 MATLAB 开始的例子,在 startup.m:

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